제출 #1154883

#제출 시각아이디문제언어결과실행 시간메모리
1154883alexdd전선 연결 (IOI17_wiring)C++20
0 / 100
0 ms328 KiB
#include "wiring.h" #include<bits/stdc++.h> using namespace std; #define int long long const int INF = 1e18; int dp[200005]; int tole[200005],tori[200005]; int pref[200005]; long long min_total_length(std::vector<int32_t> r, std::vector<int32_t> b) { vector<pair<int,int>> v; for(int x:r) v.push_back({x,0}); for(int x:b) v.push_back({x,1}); v.push_back({-1,-1}); sort(v.begin(),v.end()); int ult[2] = {0,0}; for(int i=1;i<v.size();i++) { ult[v[i].second] = i; tole[i] = ult[1-v[i].second]; pref[i] = pref[i-1] + v[i].first; } ult[0] = ult[1] = (int)v.size()-1; for(int i=(int)v.size()-1;i>0;i--) { ult[v[i].second] = i; tori[i] = v[ult[1-v[i].second]].first; } int idk=INF; for(int i=1;i<v.size();i++) { if(v[i].second != v[i-1].second) { for(int j=i-2;j>0;j--) { dp[j] = min(dp[j], dp[j+1]); if(v[j].second != v[i-1].second) break; } idk=INF; } dp[i]=INF; int ri = tole[i]; if(ri==0) continue; int le = tole[ri]+1; int lim = min(2*ri-i, ri-1); lim = max(lim, le-2); int mnm=INF,mnm2=INF; for(int j=le-1;j<=lim;j++) { mnm = min(mnm, dp[j] + pref[j] - v[ri+1].first * j); mnm2 = min(mnm2, pref[j] - v[ri+1].first * j); } mnm = min(mnm, mnm2 + idk); dp[i] = min(dp[i], mnm + ri * (v[ri+1].first - v[ri].first)); mnm=mnm2=INF; for(int j=lim+1;j<=ri-1;j++) { mnm = min(mnm, dp[j] + pref[j] - v[ri+1].first * j); mnm2 = min(mnm2, pref[j] - v[ri+1].first * j); } mnm = min(mnm, mnm2 + idk); dp[i] = min(dp[i], mnm + (i-ri) * (v[ri+1].first - v[ri].first)); dp[i] += pref[i] - pref[ri]*2 - v[ri+1].first * (i-ri) + v[ri].first * ri; dp[i] = min(dp[i], INF); idk = min(idk, dp[i]); } return dp[(int)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...