Submission #889957

#TimeUsernameProblemLanguageResultExecution timeMemory
889957winter0101Wiring (IOI17_wiring)C++14
100 / 100
116 ms58808 KiB
#include<bits/stdc++.h> #include "wiring.h" using namespace std; #define all(fl) fl.begin(),fl.end() #define pb push_back #define fi first #define se second #define for1(i,j,k) for(int i=j;i<=k;i++) #define for2(i,j,k) for(int i=j;i>=k;i--) #define for3(i,j,k,l) for(int i=j;i<=k;i+=l) #define lb lower_bound #define ub upper_bound #define sz(a) (int)a.size() #define pii pair<int,int> #define pli pair<long long,int> #define gcd __gcd #define lcm(x,y) x*y/__gcd(x,y) #define pil pair<int,long long> const int maxn=2e5+9; long long f[maxn]; const long long inf=1e18; /* 2 type of update rrrrbrrrr (just 1 blue) rrrrbbbb (red>=blue or blue>=red) */ long long l[maxn],r[maxn]; vector<long long>del1[maxn],del2[maxn],del3[maxn],add1[maxn],add2[maxn],add3[maxn];// long long pf[maxn]; long long min_total_length(vector<int> red, vector<int> blue) { int n=sz(red),m=sz(blue); vector<pli>a; a.pb({0,0}); for1(i,0,n-1)a.pb({red[i]+1,1}); for1(i,0,m-1)a.pb({blue[i]+1,0}); sort(all(a)); f[0]=0; n=n+m; for1(i,1,n)pf[i]=pf[i-1]+a[i].fi; for1(i,1,n)f[i]=inf; for2(i,n,1){ r[i]=i; if (i<n&&a[i].se==a[i+1].se)r[i]=r[i+1]; } for1(i,1,n){ l[i]=i; if (i>1&&a[i].se==a[i-1].se)l[i]=l[i-1]; } multiset<long long>f1,f2,f3;//f1 mean opposite larger, f2 opposite smaller and f3 just 1 opposite for1(i,0,n){ for (auto v:add1[i]){ f1.insert(v); //if (i==n)cerr<<v<<'\n'; } for (auto v:add2[i])f2.insert(v); for (auto v:add3[i])f3.insert(v); if (i>0){ if (!f1.empty()){ auto it=f1.begin(); long long cost=-a[l[i]].fi*(i-l[i]+1)+pf[i]-pf[l[i]-1]; f[i]=min(f[i],(*it)+cost); } if (!f2.empty()){ auto it=f2.begin(); f[i]=min(f[i],(*it)+pf[i]-pf[l[i]-1]-a[l[i]-1].fi*(i-l[i]+1)); } if (!f3.empty()){ auto it=f3.begin(); long long cost=1ll*pf[i]-pf[l[i]-1]-a[l[i]-1].fi*(i-l[i]+1); f[i]=min(f[i],(*it)+cost); } } for (auto v:del1[i])f1.erase(f1.find(v)); for (auto v:del2[i])f2.erase(f2.find(v)); for (auto v:del3[i])f3.erase(f3.find(v)); if (i==n)break; //update for type 1 if (r[i+1]+1<=n){ long long l1=i+1,r1=r[i+1],l2=r[i+1]+1,r2=r[r[i+1]+1]; add1[l2].pb(f[i]-(pf[r1]-pf[l1-1])+a[l2].fi*(r1-l1+1)); //for (auto v:add1[n])cerr<<v<<'\n'; del1[min(l2+(r1-l1+1)-1,r2)].pb(f[i]-(pf[r1]-pf[l1-1])+a[l2].fi*(r1-l1+1)); } //update for type 2 if (r[i+1]+1<=n){ long long l1=i+1,r1=r[i+1],l2=r[i+1]+1,r2=r[r[i+1]+1]; if (r2-l2+1>r1-l1+1){ l2+=(r1-l1+1); add2[l2].pb(f[i]-(pf[r1]-pf[l1-1])+a[r1].fi*(r1-l1+1)); del2[r2].pb(f[i]-(pf[r1]-pf[l1-1])+a[r1].fi*(r1-l1+1)); } } //update for type 3 if (r[i+1]+2<=n&&a[r[i+1]+2].se==a[i+1].se){ long long l1=i+1,r1=r[i+1],l2=r[i+1]+1,r2=r[i+1]+1,l3=r[i+1]+2,r3=r[r[i+1]+2]; long long cost=a[l2].fi*(r1-l1+1)-pf[r1]+pf[l1-1]+f[i]; //cerr<<l1<<" "<<r1<<" "<<l2<<" "<<r2<<" "<<l3<<" "<<r3<<'\n'; add3[l3].pb(cost); del3[r3].pb(cost); } } return f[n]; }

Compilation message (stderr)

wiring.cpp: In function 'long long int min_total_length(std::vector<int>, std::vector<int>)':
wiring.cpp:95:44: warning: unused variable 'r2' [-Wunused-variable]
   95 |     long long l1=i+1,r1=r[i+1],l2=r[i+1]+1,r2=r[i+1]+1,l3=r[i+1]+2,r3=r[r[i+1]+2];
      |                                            ^~
#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...