제출 #534584

#제출 시각아이디문제언어결과실행 시간메모리
534584benson1029전선 연결 (IOI17_wiring)C++14
100 / 100
65 ms11824 KiB
#include "wiring.h" #include<bits/stdc++.h> using namespace std; vector< pair<long long,int> > v; long long dp[200005]; long long pref[200005]; long long pref2[200005]; long long min_total_length(std::vector<int> r, std::vector<int> b) { for(int i:r) { v.push_back({i, 0}); } for(int i:b) { v.push_back({i, 1}); } v.push_back({-1, -1}); sort(v.begin(), v.end()); int prevst = 0, prevend = 0; dp[0] = 0; long long sum = 0; long long thissum = 0; for(int i=1; i<(int)v.size(); i++) { if(i>1 && v[i].second!=v[i-1].second) { prevst = prevend+1; prevend = i-1; sum = 0; // case 1: suffix min for(int j=prevend; j>=prevst-1; j--) { pref[j] = dp[j] - sum - (10000000LL-(prevend-j)) * v[prevend].first; if(j<prevend) pref[j] = min(pref[j], pref[j+1]); if(j>=prevst) sum += v[j].first; } // case 2: prefix min sum = 0; for(int j=prevend; j>=prevst-1; j--) { pref2[j] = dp[j] - sum + (prevend-j) * v[prevend+1].first; if(j>=prevst) sum += v[j].first; } for(int j=prevst; j<=prevend; j++) pref2[j] = min(pref2[j-1], pref2[j]); thissum = 0; } if(prevst==0) { dp[i] = 1e18; continue; } else { thissum += v[i].first; // case 1: cntprev <= cntthis int cnt = i-prevend; dp[i] = pref[max(prevst-1, prevend-cnt)] + (10000000LL-cnt) * v[prevend].first + thissum; // case 2: cntprev > cntthis if(prevend-cnt >= prevst-1) { dp[i] = min(dp[i], pref2[prevend-cnt] - v[prevend+1].first * cnt + thissum); } } } return dp[v.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...