제출 #1169145

#제출 시각아이디문제언어결과실행 시간메모리
1169145AlgorithmWarrior전선 연결 (IOI17_wiring)C++20
100 / 100
50 ms8128 KiB
#include "wiring.h" #include <bits/stdc++.h> using namespace std; int const MAX=2e5+5; long long const INF=1e18; struct dot{ int poz,type; long long dp,minpref,minsuf; bool operator<(dot ot){ return poz<ot.poz; } }v[MAX]; long long min_total_length(vector<int>r,vector<int>b) { int n=r.size(); int m=b.size(); int i; for(i=1;i<=n;++i){ v[i].poz=r[i-1]; v[i].type=1; } for(i=1;i<=m;++i){ v[n+i].poz=b[i-1]; v[n+i].type=2; } sort(v+1,v+n+m+1); int ult=-1; for(i=1;i<=n+m;++i){ int j=i; while(v[j].type==v[j+1].type) ++j; int id; if(ult==-1){ for(id=i;id<=j;++id) v[id].dp=INF; } else{ long long sum=0; for(id=i;id<=j;++id){ sum+=v[id].poz-v[i].poz; if(id-i+1>=ult) v[id].dp=sum+1LL*(id-i+1)*(v[i].poz-v[i-1].poz)+v[i-ult].minsuf; else v[id].dp=sum+min(1LL*(id-i+1)*(v[i].poz-v[i-1].poz)+v[2*i-id-1].minsuf,v[2*i-id-2].minpref); } } for(id=j-1;id>=i-1;--id) v[id].dp=min(v[id].dp,v[id+1].dp); long long sum=0; for(id=j;id>=i;--id){ sum+=v[j].poz-v[id].poz; v[id].minsuf=v[id-1].dp+sum; v[id].minpref=v[id-1].dp+sum+1LL*(j-id+1)*(v[j+1].poz-v[j].poz); } for(id=i+1;id<=j;++id) v[id].minpref=min(v[id].minpref,v[id-1].minpref); for(id=j-1;id>=i;--id) v[id].minsuf=min(v[id].minsuf,v[id+1].minsuf); ult=j-i+1; i=j; } return v[n+m].dp; }
#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...