Submission #1234442

#TimeUsernameProblemLanguageResultExecution timeMemory
1234442erering나일강 (IOI24_nile)C++20
100 / 100
106 ms17412 KiB
#include <bits/stdc++.h> #include "nile.h" using namespace std; #define pb push_back #define ll long long struct comp{ ll sz=1,sumb,mnodd,mneven=1e18,ev=1e18,od=1e18; }; const int MAXN=1e5+5; int par[MAXN],first[MAXN]; comp g[MAXN]; int find(int x){ return par[x]=(par[x]==x?x:find(par[x])); } //. . . . . . . ll score(int x){ x=find(x); if(g[x].sz%2==0)return g[x].sumb; return g[x].sumb+min(g[x].mnodd,g[x].ev); } void merge(int a,int b){ a=find(a); b=find(b); par[b]=a; first[a]=min(first[a],first[b]); if(g[a].sz%2){ g[a].mnodd=min(g[a].mnodd,g[b].mneven); g[a].mneven=min(g[a].mneven,g[b].mnodd); g[a].od=min(g[a].od,g[b].ev); g[a].ev=min(g[a].ev,g[b].od); } else{ g[a].mnodd=min(g[a].mnodd,g[b].mnodd); g[a].mneven=min(g[a].mneven,g[b].mneven); g[a].od=min(g[a].od,g[b].od); g[a].ev=min(g[a].ev,g[b].ev); } g[a].sz+=g[b].sz; g[a].sumb+=g[b].sumb; } vector<long long> calculate_costs(vector<int> W,vector<int> A,vector<int> B, vector<int> E) { pair<int,pair<int,int>> srt[W.size()]; for(int i=0;i<W.size();i++){ srt[i].first=W[i]; srt[i].second={A[i],B[i]}; } sort(srt,srt+W.size()); for(int i=0;i<W.size();i++){ W[i]=srt[i].first; A[i]=srt[i].second.first; B[i]=srt[i].second.second; } vector<pair<int,int>> j1,j2; for(int i=1;i<W.size();i++){ j1.pb({abs(W[i]-W[i-1]),i}); if(i>1)j2.pb({abs(W[i]-W[i-2]),i}); } ll ans=0; for(int i=0;i<W.size();i++){ ans+=A[i]; par[i]=i; g[i].sumb=B[i]; g[i].mnodd=A[i]-B[i]; first[i]=i; } sort(j1.begin(),j1.end()); sort(j2.begin(),j2.end()); reverse(j1.begin(),j1.end()); reverse(j2.begin(),j2.end()); map<int,ll> sol; vector<int> og=E; sort(E.begin(),E.end()); for(int i=0;i<E.size();i++){ while(!j1.empty() && j1.back().first<=E[i]){ int idx=j1.back().second; ans-=score(idx); ans-=score(idx-1); merge(idx-1,idx); ans+=score(idx); j1.pop_back(); } while(!j2.empty() && j2.back().first<=E[i]){ int idx=j2.back().second; ans-=score(idx); int x=find(idx); int prt=(idx-first[x])%2; if(prt%2==1)g[x].od=min(g[x].od,(long long)A[idx-1]-B[idx-1]); else g[x].ev=min(g[x].ev,(long long)A[idx-1]-B[idx-1]); ans+=score(idx); j2.pop_back(); } sol[E[i]]=ans; } vector<ll> final; for(int i=0;i<og.size();i++)final.pb(sol[og[i]]); return final; }
#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...