Submission #1131404

#TimeUsernameProblemLanguageResultExecution timeMemory
1131404bachhoangxuan나일강 (IOI24_nile)C++20
100 / 100
170 ms14328 KiB
#include "nile.h" #include<bits/stdc++.h> using namespace std; #define ll long long const int maxn = 1e5+5; const int inf = 1e9; int tree[4*maxn][2],a[maxn]; vector<pair<int,int>> P; void build(int l,int r,int id){ if(l==r){ tree[id][l&1]=P[l].second; tree[id][(l&1)^1]=inf; return; } int mid=(l+r)>>1; build(l,mid,id<<1);build(mid+1,r,id<<1|1); for(int i=0;i<=1;i++) tree[id][i]=min(tree[id<<1][i],tree[id<<1|1][i]); } void update(int l,int r,int id,int x){ if(l==r){ tree[id][(l&1)^1]=P[l].second; return; } int mid=(l+r)>>1; if(x<=mid) update(l,mid,id<<1,x); else update(mid+1,r,id<<1|1,x); for(int i=0;i<=1;i++) tree[id][i]=min(tree[id<<1][i],tree[id<<1|1][i]); } int query(int l,int r,int id,int tl,int tr){ if(tr<l || r<tl) return inf; if(tl<=l && r<=tr) return tree[id][tl&1]; int mid=(l+r)>>1; return min(query(l,mid,id<<1,tl,tr),query(mid+1,r,id<<1|1,tl,tr)); } std::vector<ll> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) { int N=(int)A.size(),Q=(int)E.size(); vector<ll> res(Q); ll total=0; for(int i=0;i<N;i++) total+=A[i],P.push_back({W[i],A[i]-B[i]}); sort(P.begin(),P.end()); build(0,N-1,1); auto get = [&](int l,int r){ if((r-l)&1) return 0; return query(0,N-1,1,l,r); }; vector<int> p(N),l(N),r(N); for(int i=0;i<N;i++) p[i]=l[i]=r[i]=i; function<int(int)> findpar = [&](int u){ if(p[u]!=u) return p[u]=findpar(p[u]); return u; }; auto change = [&](int x){ if(x<0){ x=-x; int u=findpar(x-1),v=findpar(x); total-=get(l[u],r[u])+get(l[v],r[v]); p[v]=u;r[u]=r[v]; total+=get(l[u],r[u]); } else{ int u=findpar(x); total-=get(l[u],r[u]); update(0,N-1,1,x); total+=get(l[u],r[u]); } }; vector<pair<int,int>> X; for(int i=1;i<N;i++) X.push_back({P[i].first-P[i-1].first,-i}); for(int i=1;i<N-1;i++) X.push_back({P[i+1].first-P[i-1].first,i}); sort(X.begin(),X.end()); vector<pair<int,int>> qq; for(int i=0;i<Q;i++) qq.push_back({E[i],i}); sort(qq.begin(),qq.end()); int pos=0; for(auto [D,id]:qq){ while(pos<(int)X.size() && X[pos].first<=D) change(X[pos++].second); res[id]=total; } return res; }
#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...