Submission #1133637

#TimeUsernameProblemLanguageResultExecution timeMemory
1133637Luvidi나일강 (IOI24_nile)C++20
100 / 100
132 ms24512 KiB
#include "nile.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pll pair<ll, ll> #define pii pair<int, int> #define fs first #define sc second #define pb push_back struct Seg{ int sz; vector<vector<ll>> val; }; const int maxn=1e5; int par[maxn]; int rep(int x){ if(x==par[x])return x; return par[x]=rep(par[x]); } std::vector<long long> calculate_costs(std::vector<int> w, std::vector<int> A, std::vector<int> B, std::vector<int> e) { int n=w.size(),q=e.size(); vector<ll> ans(q); ll sum=0; for(ll i:B)sum+=i; pair<int,ll> a[n]; for(int i=0;i<n;i++){ a[i]={w[i],A[i]-B[i]}; } sort(a,a+n); Seg seg[n]; for(int i=0;i<n;i++){ seg[i].sz=1; ll inf=1e18; seg[i].val={{a[i].sc,inf},{inf,inf}}; sum+=a[i].sc; par[i]=i; } pii df[n-1]; for(int i=0;i<n-1;i++){ df[i]={a[i+1].fs-a[i].fs,i}; } sort(df,df+n-1); pii qr[q]; for(int i=0;i<q;i++){ qr[i]={e[i],i}; } sort(qr,qr+q); priority_queue<pii> pq; int idx=0; for(int t=0;t<q;t++){ int x=qr[t].fs; while(idx<n-1&&df[idx].fs<=x){ int c=df[idx].sc; int r1=rep(c),r2=rep(c+1); if(seg[r1].sz%2)sum-=min(seg[r1].val[0][0],seg[r1].val[1][1]); if(seg[r2].sz%2)sum-=min(seg[r2].val[0][0],seg[r2].val[1][1]); for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ seg[r1].val[i][j]=min(seg[r1].val[i][j],seg[r2].val[i^(seg[r1].sz%2)][j]); } } if(seg[r1].sz>1){ pq.push({a[c-1].fs-a[c+1].fs,c}); } if(seg[r2].sz>1){ pq.push({a[c].fs-a[c+2].fs,c+1}); } seg[r1].sz+=seg[r2].sz; if(seg[r1].sz%2){ sum+=min(seg[r1].val[0][0],seg[r1].val[1][1]); } par[r2]=r1; idx++; } while(!pq.empty()&&-pq.top().fs<=x){ int c=pq.top().sc; pq.pop(); int r=rep(c),b=(c-r)%2; if(seg[r].sz%2)sum-=min(seg[r].val[0][0],seg[r].val[1][1]); seg[r].val[b][1]=min(seg[r].val[b][1],a[c].sc); if(seg[r].sz%2)sum+=min(seg[r].val[0][0],seg[r].val[1][1]); } ans[qr[t].sc]=sum; } 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...