Submission #1289264

#TimeUsernameProblemLanguageResultExecution timeMemory
1289264sasdeDistributing Candies (IOI21_candies)C++20
100 / 100
1028 ms45068 KiB
#include<bits/stdc++.h> using namespace std; bool M1; #define PI 3.14159265358979323846 #define sz(a) (int)a.size() #define all(x) x.begin(),x.end() #define ii pair<int,int> #define iii pair<int,ii> #define iv pair<ii,ii> #define se second #define fi first #define ffi fi.fi #define sfi se.fi #define sse se.se #define fse fi.se #define lt(i, c, d) for(int i = c; i <= d; ++i) #define fl(i, c, d) for(int i = d; i >= c; --i) #define pb push_back #define emb emplace_back #define emf emplace_front #define em emplace #define look_memory cerr<<abs(&M2-&M1)/1024.0/1024<<'\n' #define look_time cerr << "TIME : " << clock() * 0.001 << "s" <<'\n' const int N=1e6+5,lg=30,mod=1e9+7; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int Rand(int u,int v){ return u+rd()%(v-u+1); } int dx[]={1,0,-1,0,1,1,-1,-1}; int dy[]={0,-1,0,1,1,-1,1,-1}; int query,node; vector<ii>req[N]; struct segmax { int n; vector<long long> st, lazy; segmax() {}; segmax(int _n): n(_n), st(n * 4 + 5, 0), lazy(n * 4 + 5, 0) {}; void down(int id) { if (lazy[id] == 0) return; lazy[id << 1] += lazy[id]; lazy[id << 1 | 1] += lazy[id]; st[id << 1] += lazy[id]; st[id << 1 | 1] += lazy[id]; lazy[id] = 0; } void update(int id, int l, int r, int u, int v, int val) { if (r < u || l > v) return; if (l >= u && r <= v) { st[id] += val; lazy[id] += val; return; } down(id); int mid = (l + r) >> 1; update(id << 1, l, mid, u, v, val); update(id << 1 | 1, mid + 1, r, u, v, val); st[id] = max(st[id << 1], st[id << 1 | 1]); } long long get(int id, int l, int r, int u, int v) { if (r < u || l > v) return -1e18; if (l >= u && r <= v) return st[id]; down(id); int mid = (l + r) >> 1; return max(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } }; struct segmin { int n; vector<long long> st, lazy; segmin() {}; segmin(int _n): n(_n), st(n * 4 + 5, 0), lazy(n * 4 + 5, 0) {}; void down(int id) { if (lazy[id] == 0) return; lazy[id << 1] += lazy[id]; lazy[id << 1 | 1] += lazy[id]; st[id << 1] += lazy[id]; st[id << 1 | 1] += lazy[id]; lazy[id] = 0; } void update(int id, int l, int r, int u, int v, int val) { if (r < u || l > v) return; if (l >= u && r <= v) { st[id] += val; lazy[id] += val; return; } down(id); int mid = (l + r) >> 1; update(id << 1, l, mid, u, v, val); update(id << 1 | 1, mid + 1, r, u, v, val); st[id] = min(st[id << 1], st[id << 1 | 1]); } long long get(int id, int l, int r, int u, int v) { if (r < u || l > v) return 1e18; if (l >= u && r <= v) return st[id]; down(id); int mid = (l + r) >> 1; return min(get(id << 1, l, mid, u, v), get(id << 1 | 1, mid + 1, r, u, v)); } }; bool M2; vector<int> distribute_candies(vector<int> c, vector<int> l,vector<int> r, vector<int> v) { node=sz(c); // for(auto x:c)cout <<x<<" "; query=sz(l); vector<int>resans(node+1,0),ans(node,0); segmax maxx(query); segmin minn(query); vector<ii>x; for(int i=1;i<=query;++i){ req[l[i-1]+1].emb(i,v[i-1]); req[r[i-1]+2].emb(i,-v[i-1]); } for(int i=1;i<=node;++i){ for(auto x:req[i]){ maxx.update(1,0,query,x.fi,query,x.se); minn.update(1,0,query,x.fi,query,x.se); // cout <<x.fi<<" "<<x.se<<'\n'; } if(maxx.st[1]-minn.st[1]<c[i-1]){ ans[i-1]=maxx.get(1,0,query,query,query)-minn.st[1]; continue; } // cout<<'\n'; int l=0,r=query,pos=0; while(l<=r){ int mid=(r+l)>>1; long long val=maxx.get(1,0,query,mid,query)-minn.get(1,0,query,mid,query); // cout<<mid<<" "<<val<<" "<<c[i]<<'\n'; if(val>=c[i-1]){ pos=mid; l=mid+1; } else r=mid-1; } // cout <<i<<" "<<pos<<" "<<c[i-1]<<'\n'; if(minn.get(1,0,query,pos,query)==minn.get(1,0,query,pos,pos)){ ans[i-1]=c[i-1]-(maxx.get(1,0,query,pos,query)-maxx.get(1,0,query,query,query)); } else ans[i-1]=minn.get(1,0,query,query,query)-minn.get(1,0,query,pos,query); } return ans; } // main() // { // srand(time(0)); // ios_base::sync_with_stdio(false); // cin.tie(NULL); // cout.tie(NULL); // #define task "aws" // if(fopen(task".inp","r")){ // freopen(task".inp","r",stdin); // freopen(task".out","w",stdout); // } // int t=1; // // cin >> t; // int node,query; // cin >> node; // vector<int>c(node); // for(auto &x:c){ // cin >> x; // // cout <<x<<" "; // } // cin>> query; // vector<int>l(query),r(query),v(query); // for(int i=0;i<query;++i){ // int q,w,val; // cin >> q >> w >> val; // l[i]=q; // r[i]=w; // v[i]=val; // } // vector<int>x=distribute_candies(c,l,r,v); // for(auto y:x)cout <<y<<" "; // }
#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...