Submission #1321395

#TimeUsernameProblemLanguageResultExecution timeMemory
1321395trandkBigger segments (IZhO19_segments)C++20
0 / 100
0 ms332 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <functional> #include <iostream> using namespace __gnu_pbds; using namespace std; #define for0(i, n) for(int i=0; i<n; i++) #define for1(i, n) for(int i=1; i<=n; i++) #define mnto(a, b) a = min(a, (__typeof__(a))b) #define mxto(a, b) a = max(a, (__typeof__(a))b) #define sz(a) (int)a.size(); #define ll long long #define ld long double #define pii pair<int, int> #define pll pair<ll, ll> #define pil pair<int, ll> #define pli pair<ll, int> #define arint vector<int> #define arll vector<ll> #define arpii vector<pii> #define arpll vector<pll> #define arpil vector<pil> #define arpli vector<pli> #define arbool vector<bool> #define archar vector<char> #define matint vector<arint> #define matll vector<arll> #define matpii vector<arpii> #define matpll vector<arpll> #define matpil vector<arpil> #define matpli vector<arpli> #define f first #define s second #define all(x) x.begin(), x.end() #define pb push_back #define mp make_pair #define FAST_IO cin.tie(0), ios_base::sync_with_stdio(0); #define INF 1000000001 #define MAXN 200005 #define MOD 1000000007 //~ #define int ll //VARIABLES FOR DSA------------------------------------------ int n; int binlog(int a){ int ans = 0; while(a/=2) ans++; return ans; } //CODED DS HERE struct segtree{ //RANGE QUERY 0-INDEX [l, r) int h = 0; //HEIGHT OF SEGTREE arll t; //SEGTREE arll d; //DELAYTREE //COMBINE FUNCTION-------------------------------------------------- ll comupd(ll a, ll b){ //CHANGE return a + b; } ll comque(ll a, ll b){ //CHANGE return max(a, b); } //INITIALIZE-------------------------------------------------------- void buildseg(arll ar){ t.resize(n*2); d.resize(n); for(int x=n; x>0; x>>=1) h++; for(int i=0; i<n; ++i) t[n+i] = ar[i+1]; //1-INDEX ar for(int i = n-1; i>0; i--) t[i] = comque(t[i<<1], t[i<<1|1]); } //NORMAL------------------------------------------------------------ //~ void update(int pos, pii val) { //POINT ASSIGNMENT //~ for(t[pos+=n]=val; pos>>=1; ) //~ t[pos] = comupd(t[pos<<1], t[pos<<1|1]); //~ } //~ ll query(int l, int r){ //INTERVAL [l, r) //~ pii resl = -INF, resr = resl; //INIT //~ for(l+=n, r+=n; l<r; l>>=1, r>>=1) { //~ if(l&1) resl = comque(resl, t[l++]); //~ if(r&1) resr = comque(resr, t[--r]); //~ } //~ return comque(resl, resr); //~ } //LAZY-------------------------------------------------------------- void apply(int p, ll val){ t[p] = comupd(t[p], val); if(p<n) d[p] = comupd(d[p], val); } void build_up(int p){ while(p>1){ p >>= 1, t[p] = comque(t[p<<1], t[p<<1|1]); t[p] = comupd(t[p], d[p]); } } void push(int p){ for(int s=h; s>0; --s){ int i = p >> s; if(d[i] != 0){ apply(i<<1, d[i]); apply(i<<1|1, d[i]); d[i] = 0; } } } void upd(int l, int r, ll val){ int l0 = l+n, r0 = r+n; for (; l0 < r0; l0 >>= 1, r0 >>= 1){ if (l0&1) apply(l0++, val); if (r0&1) apply(--r0, val); } build_up(l+n); build_up(r-1+n); } ll query(int l, int r){ int l0 = l+n, r0 = r+n; push(l0); push(r0 - 1); ll resl = -INF, resr = resl; //CHANGE for(; l0<r0; l0>>=1, r0>>=1) { if(l0&1) resl = comque(resl, t[l0++]); if(r0&1) resr = comque(resr, t[--r0]); } return comque(resl, resr); } }; struct tgraph{ matint al, par; //INPUT UNDIRECTED EDGES arint dep; int h; void init(){ al.resize(n+5); //1-INDEX dep.resize(n+5); } void bfs(){ queue<pair<pii, int>> q; q.push({{1, 1}, 0}); while(!q.empty()){ int p = q.front().f.f, node = q.front().f.s; dep[node] = q.front().s; q.pop(); par[0][node] = p; for(int i:al[node]){ if(i == p) continue; q.push({{node, i}, dep[node]+1}); } } } void build2dec(){ h = binlog(n); par.resize(h+1, arint(n+5, 0)); bfs(); //~ cerr<<"[par] = [\n0: "; //~ for1(i, n) cerr<<par[0][i]<<", "; //~ cerr<<"]\n"; for1(i, h){ //~ cerr<<i<<": ["; for1(j, n){ par[i][j] = par[i-1][par[i-1][j]]; //~ cerr<<par[i][j]<<", "; } //~ cerr<<"]\n"; } } int kpar(int node, int k){ //~ cerr<<"[node, k] = ["<<node<<", "<<k<<"]\n"; for0(i, h+1){ if(k>>i & 1){ node = par[i][node]; } } //~ cerr<<"[after jump] = ["<<node<<"]\n"; return node; } int lca(int u, int v){ if(dep[u] < dep[v]) swap(u, v); //~ cerr<<"[u, v, dep[u], dep[v]] = ["<<u<<", "<<v<<", "<<dep[u]<<", "<<dep[v]<<"]\n"; u = kpar(u, dep[u]-dep[v]); if(u == v) return u; for(int i=h; i>=0; i--) if(par[i][u] != par[i][v]) u = par[i][u], v = par[i][v]; return par[0][u]; } }; struct dsunion{ arint par, sz, rk; void resize(int l){ par.resize(l); sz.resize(l); rk.resize(l); } void make(int v){ par[v] = v; //~ sz[v] = 1; //BY SIZE rk[v] = 0; //BY RANK } int find(int v){ if (v == par[v]) return v; return par[v] = find(par[v]); } bool merge(int a, int b){ a = find(a); b = find(b); if (a != b){ //BY SIZE //~ if(sz[a] < sz[b]) swap(a, b); //~ sz[a] += sz[b]; //BY RANK if(rk[a] < rk[b]) swap(a, b); if(rk[a] == rk[b]) rk[a]++; par[b] = a; return true; } return false; } }; struct line{ //STRUCT FOR LICHAO TREE ll m, c; line(){ m = 0, c = -2e18; } line(ll _m, ll _c){ m = _m, c = _c; } ll operator () (int x) {return (ll) m * x + c;} bool operator == (line nl) {return m == nl.m && c == nl.c;} }; struct lcnode{ //LICHAO TREE ( SEGTREE [l, r) ) USING LINES) TO FIND MAX Y int s, e, m; line ln; lcnode *l = nullptr, *r = nullptr; lcnode(int _s, int _e){ s = _s, e = _e, m = (s + e) >> 1; } void mc(){ if(l != nullptr || s + 1 == e)return; l = new lcnode(s, m); r = new lcnode(m, e); } ll query(int x){ if(s + 1 == e || l == nullptr) return ln(x); else if(x < m) return max(ln(x), l->query(x)); else return max(ln(x), r->query(x)); } void insert(line nl){ if(s + 1 == e){ if(ln(s) < nl(s))swap(ln, nl); return; } bool lf = ln(s) > nl(s), mid = ln(m) < nl(m), rgt = ln(e) > nl(e); if(mid) swap(ln, nl); if(nl == line() || lf == rgt) return; mc(); if(lf != mid) r->insert(nl); else l->insert(nl); } }; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset; //CODED ALGO HERE-------------------------------------------- arint dijkstra(matpii al, ll st){ //SINGLE SOURCE SHORTEST PATH (POSITIVE) arint d(n+5, -1); priority_queue<pii, vector<pii>, greater<pii>> pq; pq.push({0, st}); while(!pq.empty()){ int weight = pq.top().f, node = pq.top().s; pq.pop(); if(d[node] == -1) d[node] = weight; else if(d[node] < weight) continue; for(auto [v, w]:al[node]){ if(d[v] == -1 || d[v] > weight + w){ d[v] = weight + w; pq.push({d[v], v}); } } } for1(i, n) if(d[i] == -1) d[i] = INF; return d; //DIST FROM ST TO OTHER NODES } pair<arint, bool> bellman_ford(matpii al, int st){ //SSSP (NEGATIVE), NEGATIVE WEIGHT LOOP //SSSP arint d(MAXN, INF); d[st] = 0; for1(i, n-1){ bool modified = false; for1(v, n){ if(d[v] == INF) continue; for(auto node:al[v]){ if(d[v] + node.s > d[node.f]) continue; d[node.f] = d[v] + node.s; modified = true; } } if(!modified) break; } //CHECK FOR NEGATIVE LOOP bool isNegLoop = false; for1(i, n-1){ if(isNegLoop == true) break; for1(v, n){ if(isNegLoop == true) break; for(auto node:al[v]){ if(d[v] + node.s >= d[node.f]) continue; isNegLoop = true; break; } } } return {d, isNegLoop}; } matint floyd_warshall(matpii al){ //ALL PAIRS SHORTEST PATH matint ans(n+5, arint(n+5, INF)); for1(i, n){ ans[i][i] = 0; for(auto [v, w]:al[i]){ ans[i][v] = min(ans[i][v], w); } } for1(m, n) for1(u, n) for1(v, n){ if(ans[u][m] != INF && ans[m][v] != INF) ans[u][v] = min(ans[u][v], ans[u][m] + ans[m][v]); } return ans; } matpii mst_kruskal(vector<pair<int, pii>> edges, int e){ //edges[i] = {weight, {u, v}} arbool isV(n+5, false); matpii al(n+5, arpii()); sort(edges.begin()+1, edges.begin()+1+e); //MIN SPANNING TREE for1(i, e){ int w = edges[i].f, u = edges[i].s.f, v = edges[i].s.s; if(isV[u] && isV[v]) continue; //DIRECTED isV[u] = isV[v] = true; al[u].pb({v, w}); } return al; } matpii mst_prim(matpii al){ //PRIM bool isV[n+5] = {0}; matpii ans(n+5, arpii()); priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii>>> pq; //MIN SPANNING TREE pq.push({0, {0, 1}}); //MIN SPANNING TREE while(!pq.empty()){ int w = pq.top().f, u = pq.top().s.f, v = pq.top().s.s; pq.pop(); isV[u] = isV[v] = true; ans[u].pb({v, w}); //DIRECTED for(auto i:al[v]){ if(isV[v] && isV[i.f]) continue; pq.push({i.s, {v, i.f}}); } } return ans; } //VARIABLE HERE---------------------------------------------- arll a; //CODE------------------------------------------------------- void solve(){ cin>>n; a.resize(n+5); for1(i, n) cin>>a[i]; int seg = 1; ll pre = a[1], cur = 0, id = 2; for(int i=2; i<=n; i++){ cur += a[i]; if(cur >= pre){ while(pre + a[id] <= cur - a[id]){ id++; cur -= a[id]; pre += a[id]; } pre = cur; cur = 0; id = i+1; seg++; } //~ cerr<<"[pre, cur, seg] = ["<<pre<<", "<<cur<<", "<<seg<<"]\n"; } cout<<seg<<"\n"; } int32_t main(){ FAST_IO //~ freopen("INP.txt", "r", stdin); //~ freopen("OUT.txt", "w", stdout); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...