제출 #612608

#제출 시각아이디문제언어결과실행 시간메모리
612608pulsatio전선 연결 (IOI17_wiring)C++14
30 / 100
1071 ms10168 KiB
#include<iostream> #include<vector> //#include"wiring.h" using namespace std; typedef long long ll; const int maxn=200000+10; const ll inf = 1LL << 62; ll dp[maxn],sum[maxn]; ll get_sum(int r,int l){ if(l<0)return sum[r]; return sum[r]-sum[l]; } ll min_total_length(vector<int> red,vector<int> blue){ int n = red.size(); int m = blue.size(); vector<pair<ll,ll> > all; int x=0,y=0; while(x < n || y < m){ if(x==n) all.push_back(make_pair(blue[y++],1)); else if(y==m || red[x]<blue[y]) all.push_back(make_pair(red[x++],0)); else all.push_back(make_pair(blue[y++],1)); } dp[0] = inf; sum[0] = all[0].first; for(int i=1;i<n+m;i++)sum[i]=sum[i-1]+all[i].first; ll pos=0; for(int i=1;i<n+m;i++){ pos=i; if(all[i].second == all[0].second) dp[i]=inf; else break; } for(ll i=pos;i<n+m;i++){ if(all[i].second != all[0].second) dp[i] = get_sum(i,pos-1) - (i-pos+1)*all[pos].first + pos*all[pos-1].first - get_sum(pos-1,-1) + max(pos,i-pos+1)*(all[pos].first - all[pos-1].first); else{ pos=i; break; } if(i==n+m-1)pos=n+m; } for(ll i=pos;i<n+m;i++){ dp[i] = inf; if(dp[i-1]==inf && all[i].second == all[i-1].second) continue; ll ind = -1; for(int j=i-1;j>=0;j--){ if(all[j].second != all[i].second){ ind = j; break; } } for(int j=ind;j>=0;j--){ if(all[j].second == all[i].second) break; dp[i] = min(dp[i], min(dp[j],dp[j-1]) + get_sum(i,ind) - (i-ind)*all[ind+1].first + (ind-j+1)*all[ind].first - get_sum(ind,j-1) + max(ind-j+1,i-ind)* (all[ind+1].first-all[ind].first)); } } return dp[n+m-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...