Submission #1215956

#TimeUsernameProblemLanguageResultExecution timeMemory
1215956hengliaoNile (IOI24_nile)C++20
100 / 100
81 ms17580 KiB
#include "nile.h" #include<bits/stdc++.h> using namespace std; #define F first #define S second #define pll pair<ll, ll> #define vll vector<ll> #define pb push_back typedef long long ll; namespace{ const ll mxN=1e5+5; const ll inf=1e18; ll dsu[mxN], mn[mxN][3], lef[mxN], rig[mxN]; ll ans; void add(ll tar){ ll siz=abs(dsu[tar]); if(siz%2==1){ ans+=min(mn[tar][lef[tar]&1], mn[tar][2]); } } void era(ll tar){ ll siz=abs(dsu[tar]); if(siz%2==1){ ans-=min(mn[tar][lef[tar]&1], mn[tar][2]); } } ll find_set(ll tar){ if(dsu[tar]<0) return tar; return dsu[tar]=find_set(dsu[tar]); } void unite(ll a, ll b){ ll f=find_set(a); ll s=find_set(b); if(abs(dsu[f])<abs(dsu[s])) swap(f, s); era(f); era(s); dsu[f]+=dsu[s]; mn[f][0]=min(mn[f][0], mn[s][0]); mn[f][1]=min(mn[f][1], mn[s][1]); mn[f][2]=min(mn[f][2], mn[s][2]); lef[f]=min(lef[f], lef[s]); rig[f]=max(rig[f], rig[s]); dsu[s]=f; add(f); } } vector<long long> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) { memset(dsu, -1, sizeof(dsu)); ll n=W.size(); ll q=E.size(); vll w(n), a(n), b(n); vll ord(n); for(ll i=0;i<n;i++){ ord[i]=i; } auto compare=[&](ll x, ll y){ return W[x]<W[y]; }; sort(ord.begin(), ord.end(), compare); for(ll i=0;i<n;i++){ w[i]=W[ord[i]]; a[i]=A[ord[i]]; b[i]=B[ord[i]]; } vector<array<ll, 2>> edges; vector<array<ll, 2>> dumb; ans=0; for(ll i=0;i<n;i++){ ans+=a[i]; for(ll j=0;j<3;j++){ mn[i][j]=inf; } mn[i][i&1]=a[i]-b[i]; lef[i]=i; rig[i]=i; if(i<n-1) edges.pb({w[i+1]-w[i], i}); if(i>0 && i<n-1){ dumb.pb({w[i+1]-w[i-1], i}); } } vector<array<ll, 2>> qry; for(ll i=0;i<q;i++){ qry.pb({E[i], i}); } sort(qry.begin(), qry.end()); sort(edges.begin(), edges.end()); sort(dumb.begin(), dumb.end()); vll re(q); ll pt=0, pt2=0; for(auto &[x, y]:qry){ while(pt<(ll) edges.size() && edges[pt][0]<=x){ if(find_set(edges[pt][1])!=find_set(edges[pt][1]+1)){ unite(edges[pt][1], edges[pt][1]+1); } pt++; } while(pt2<(ll) dumb.size() && dumb[pt2][0]<=x){ ll cur=dumb[pt2][1]; ll p=find_set(cur); era(p); mn[p][2]=min(mn[p][2], a[cur]-b[cur]); add(p); pt2++; } re[y]=ans; } return re; }
#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...