제출 #249301

#제출 시각아이디문제언어결과실행 시간메모리
249301kostia244전선 연결 (IOI17_wiring)C++17
100 / 100
116 ms13048 KiB
#include "wiring.h" #include<bits/stdc++.h> using namespace std; using ll = long long; const int maxn = 1<<19; const ll inf = 1ll<<60; inline void minq(ll &a, ll b) { a = min(a, b); } struct st { ll bias = 0; multiset<ll> s; void insert(ll x) { s.insert(x-bias); } void erase(ll x) { s.erase(s.find(x-bias)); } ll min() { return (s.empty()?1ll<<60:(bias+*s.begin())); } void addall(ll x) { bias += x; } }; int n, m; array<int, 2> x[maxn]; ll dp[maxn], ia[maxn]; void calc(int pl, int cl, int cr) { st a, b; //cout << pl << "here\n"; for(ll t = 0, mp = dp[cl-1], i = cl; --i >= pl;) { t += x[cl][0] - x[i][0]; mp = min(mp, dp[i-1]); ia[i] = mp + t; a.insert(ia[i]); //cout << ia[i] << '\n'; } for(int i = cl; i < cr; i++) { if(i > cl) { int mir = cl - (i-cl) - 1; if(mir+1 >= pl) { ll erval = ia[mir+1] + a.bias; a.erase(erval); b.insert(erval); } a.addall(x[i][0] - x[cl][0]); b.addall(x[i][0] - x[cl-1][0]); } dp[i] = min(a.min(), b.min()); } //cout << cl << " -- " << cr << endl; //for(int i = 0; i <= n+m; i++) cout << dp[i] << " "; cout << '\n'; } ll min_total_length(vector<int> r, vector<int> b) { n = r.size(), m = b.size(); for(int i = 0; i < n; i++) x[1+i] = {r[i], 0}; for(int i = 0; i < m; i++) x[1+n+i] = {b[i], 1}; sort(x+1, x+n+m+1); dp[0] = 0; for(int p = 0, i = 1; i <= n+m;) { int j = i+1; while(j <= n+m && x[j][1] == x[i][1]) j++; if(p) calc(p, i, j); else for(int t = i; t < j;) dp[t++] = 1ll<<60; p = i; i = j; } return dp[n+m]; }
#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...