Submission #581092

#TimeUsernameProblemLanguageResultExecution timeMemory
581092Koosha_mv전선 연결 (IOI17_wiring)C++14
100 / 100
476 ms22552 KiB
#include <bits/stdc++.h> using namespace std; #define dbgv(v) cout<<#v<<" = "; f(i,0,v.size()) cout<<v[i]<<" "; cout<<endl #define dbga(a,x,y) cout<<#a<<" = "; f(i,x,y) cout<<a[i]<<" "; cout<<endl #define erorp(x) cout<<#x<<"={"<<x.F<<" , "<<x.S<<"}"<<endl #define eror(x) cout<<#x<<'='<<(x)<<endl #define f_(i,a,b) for(int i=a;i>=b;i--) #define f(i,a,b) for(int i=a;i<b;i++) #define nb(x) __builtin_popcount(x) #define all(v) v.begin(),v.end() #define bit(n,k) (((n)>>(k))&1) #define Add(x,y) x=(x+y)%mod #define maxm(a,b) a=max(a,b) #define minm(a,b) a=min(a,b) #define lst(x) x[x.size()-1] #define sz(x) int(x.size()) #define mp make_pair #define ll long long #define pb push_back #define S second #define F first #include "wiring.h" const int N=2e5+99; const ll inf=1e15+99; int n; ll last[2],st[2],dp[N],seg[N<<2],lz[N<<2]; vector<pair<ll,ll>> A; vector<pair<pair<ll,ll>,ll>> op; void shift(int id){ seg[id*2+0]+=lz[id]; seg[id*2+1]+=lz[id]; lz[id*2+0]+=lz[id]; lz[id*2+1]+=lz[id]; lz[id]=0; } void add(int L,int R,ll val,int id=1, int l=1,int r=n+1){ if(r<=L || R<=l) return ; if(L<=l && r<=R){ lz[id]+=val; seg[id]+=val; return ; } int mid=(l+r)>>1; shift(id); add(L,R,val,id*2+0,l,mid); add(L,R,val,id*2+1,mid,r); seg[id]=min(seg[id*2+0],seg[id*2+1]); } void clear(){ for(auto p : op){ add(p.F.F,p.F.S,p.S); } op.clear(); } void addseg(int l,int r,ll val){ op.pb({{l,r},val}); add(l,r,val); } ll query(int L,int R,int id=1,int l=1,int r=n+1){ if(r<=L || R<=l) return inf; if(L<=l && r<=R){ return seg[id]; } shift(id); int mid=(l+r)>>1; return min(query(L,R,id*2+0,l,mid),query(L,R,id*2+1,mid,r)); } ll min_total_length(vector<int> r,vector<int> b){ last[0]=-inf,last[1]=-inf; for(auto x : r) A.pb({x,0}); for(auto x : b) A.pb({x,1}); A.pb({-1,-1}); sort(all(A)); n=A.size()-1; f(i,1,n+1){ dp[i]=inf; if(A[i].S!=A[i-1].S){ st[A[i].S]=i; clear(); f_(j,i-1,1){ if(A[j].S==A[i].S) break; addseg(1,j+1,A[i].F-A[j].F); } } if(i-st[A[i].S]<st[A[i].S]-st[A[i].S^1] && st[A[i].S]!=1){ ll len=A[i].F-A[st[A[i].S]].F,prt=i-st[A[i].S]; addseg(st[A[i].S^1],i-prt-prt,len); dp[i]=query(st[A[i].S^1],i-prt-prt); } maxm(last[A[i].S],1ll*A[i].F); minm(dp[i],dp[i-1]+A[i].F-last[A[i].S^1]); ll res=0; f_(j,i-1,1){ if(A[j].S==A[i].S) break; res+=A[i].F-A[j].F; minm(dp[i],dp[j-1]+res); } if(i!=n){ add(i+1,i+2,dp[i]); } } return dp[A.size()-1]; }
#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...