Submission #1237777

#TimeUsernameProblemLanguageResultExecution timeMemory
1237777PajarajaNile (IOI24_nile)C++20
100 / 100
140 ms14252 KiB
#include <bits/stdc++.h> #define MAXN 100007 using namespace std; long long seg[4*MAXN][2]; int dsu[MAXN],rb[MAXN],n; int root(int u){ while(dsu[u]!=u) { dsu[u]=dsu[dsu[u]]; u=dsu[u]; } return u; } void connect(int u,int v){ u=root(u); v=root(v); dsu[v]=u; rb[u]=rb[v]; } void build(int l,int r,int k,int ind){ seg[ind][k]=1000000000000000000LL; if(l==r) return; int s=(l+r)/2; build(l,s,k,2*ind); build(s+1,r,k,2*ind+1); } void upd(int l,int r,int k, int g,int v,int ind) { if(l==r){ seg[ind][k]=v; return; } int s=(l+r)/2; if(g<=s) upd(l,s,k,g,v,2*ind); else upd(s+1,r,k,g,v,2*ind+1); seg[ind][k]=min(seg[2*ind][k],seg[2*ind+1][k]); } long long nmin(int l,int r,int k,int lt,int rt,int ind){ if(l>=lt && r<=rt) return seg[ind][k]; if(l>rt || r<lt) return 1000000000000000000LL; int s=(l+r)/2; return min(nmin(l,s,k,lt,rt,2*ind),nmin(s+1,r,k,lt,rt,2*ind+1)); } long long skor(int l,int r){ if((r-l+1)&1) return nmin(0,n,l&1,l,r,1); return 0; } vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E){ vector<long long> ans; n=W.size(); long long rez=0; for(int i=0;i<n;i++) rez+=A[i]; vector<pair<int,int>> v; vector<pair<pair<int,int>,int>> events; for(int i=0;i<n;i++) v.push_back({W[i],A[i]-B[i]}); sort(v.begin(),v.end()); for(int i=0;i<E.size();i++) { events.push_back({{E[i],3},i}); ans.push_back(0); } for(int i=0;i+1<n;i++) events.push_back({{v[i+1].first-v[i].first,1},i}); for(int i=1;i+1<n;i++) events.push_back({{v[i+1].first-v[i-1].first,2},i}); sort(events.begin(),events.end()); for(int i=0;i<n;i++) dsu[i]=rb[i]=i; build(0,n,0,1); build(0,n,1,1); for(int i=0;i<n;i++) upd(0,n,i&1,i,v[i].second,1); for(int i=0;i<events.size();i++){ if(events[i].first.second==1){ int x=events[i].second; rez-=skor(root(x),x); rez-=skor(x+1,rb[x+1]); connect(x,x+1); rez+=skor(root(x),rb[x+1]); } if(events[i].first.second==2){ int x=events[i].second; int l=root(x); int r=rb[l]; rez-=skor(l,r); upd(0,n,(x+1)&1,x,v[x].second,1); rez+=skor(l,r); } if(events[i].first.second==3){ ans[events[i].second]=rez; } } return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...