제출 #56269

#제출 시각아이디문제언어결과실행 시간메모리
56269Kerim전선 연결 (IOI17_wiring)C++17
100 / 100
103 ms7916 KiB
#include "bits/stdc++.h" #define MAXN 200009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} ll dp[MAXN],par[MAXN]; ll min_total_length(vector<int>a,vector<int>b){ int n=a.size(); int m=b.size(); vector<PII>v; for(int i=0;i<n;i++) v.pb(mp(a[i],0)); for(int i=0;i<m;i++) v.pb(mp(b[i],1)); v.pb(mp(-1,-1)); sort(all(v)); vector<PII>len; for(int i=1;i<int(v.size());i++) par[i]=par[i-1]+v[i].ff; for(int i=1;i<int(v.size());i++){ int j=i; while(j<int(v.size()) and v[i].ss==v[j].ss) j++; len.pb(mp(i,j-1)); i=j-1; } if(len.size()==1) return 0; for(int i=len[0].ff;i<=len[0].ss;i++) dp[i]=dp[i-1]+v[len[1].ff].ff-v[i].ff; for(int i=1;i<min(INF,int(len.size()));i++){ int a=len[i-1].ff,b=len[i-1].ss; int c=len[i].ff,d=len[i].ss; int sz=min(b-a,d-c)+1; for(int j=1;j<=sz;j++){ if(b-a+1>j) dp[c+j-1]=(par[c+j-1]-par[c-1])-(par[b]-par[b-j])+dp[b-j]; else{ if(i>1) dp[c+j-1]=(par[c+j-1]-par[c-1])-(par[b]-par[b-j])+dp[len[i-2].ss]; else dp[c+j-1]=(par[c+j-1]-par[c-1])-(par[b]-par[b-j]); } if(j>1){ umin(dp[c+j-1],dp[c+j-2]+v[c+j-1].ff-v[b].ff); if(i+1<int(len.size())) umin(dp[c+j-1],dp[c+j-2]+v[len[i+1].ff].ff-v[c+j-1].ff); } else{ umin(dp[c],1LL*v[c].ff-v[b].ff+dp[b]); if(i+1<int(len.size())) umin(dp[c],1LL*v[len[i+1].ff].ff-v[c].ff+dp[b]); } //~ cout<<dp[c+j-1]<<" "<<c+j-1<<endl; } for(int j=sz+1;j<=d-c+1;j++){ dp[c+j-1]=dp[c+j-2]+v[c+j-1].ff-v[b].ff; if(i+1<int(len.size())) umin(dp[c+j-1],dp[c+j-2]+v[len[i+1].ff].ff-v[c+j-1].ff); //~ cout<<dp[c+j-1]<<" "<<c+j-1<<endl; } } return dp[v.size()-1]; } //I want O(N) solution :) //succed ? yes or no //~ int main(){ //~ freopen("file.in", "r", stdin); //~ int n,m; //~ cin>>n; //~ vector<int>a,b; //~ while(n--){ //~ int x; //~ scanf("%d",&x);a.pb(x); //~ } //~ cin>>m; //~ while(m--){ //~ int x; //~ scanf("%d",&x);b.pb(x); //~ } //~ printf("%lld\n",min_total_length(a,b)); //~ return 0; //~ } //~
#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...