제출 #282607

#제출 시각아이디문제언어결과실행 시간메모리
282607doowey전선 연결 (IOI17_wiring)C++14
17 / 100
1088 ms7144 KiB
#include <bits/stdc++.h> #include "wiring.h" using namespace std; typedef long long ll; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair const ll inf = (ll)1e18; ll min_total_length(vector<int> r, vector<int> b) { vector<pii> al; al.push_back(mp(-1, 0)); for(auto x : r) al.push_back(mp(x, 0)); for(auto x : b) al.push_back(mp(x, 1)); sort(al.begin(), al.end()); int sz = al.size(); vector<ll> dp(sz); for(int i = 1; i < sz; i ++ ){ dp[i] = inf; } vector<int> cur[2]; ll csu = 0; ll extra; int s2 = 0, s1 = 0; for(int i = 1; i < sz; i ++ ){ if(al[i].se != al[i-1].se){ cur[0].clear(); swap(cur[0], cur[1]); } cur[1].push_back(i); if(!cur[0].empty()){ dp[i]=dp[i-1]+al[i].fi-al[cur[0].back()].fi; csu = 0; for(auto x : cur[1]){ csu += al[x].fi; } s2 = cur[1].size(); s1 = 0; for(int j = cur[0].size() - 1; j >= 0 ; j -- ){ s1 ++ ; csu -= al[cur[0][j]].fi; if(s1 < s2) extra = -(s2 - s1) * 1ll * al[cur[0].back()].fi; else extra = (s1-s2) * 1ll * al[cur[1][0]].fi; dp[i] = min(dp[i], extra + csu + dp[cur[0][j] - 1]); } } } return dp[sz - 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...