제출 #262247

#제출 시각아이디문제언어결과실행 시간메모리
262247Namnamseo전선 연결 (IOI17_wiring)C++17
100 / 100
76 ms12364 KiB
#include <bits/stdc++.h> using namespace std; using ll=long long; using pp=pair<int,int>; #define eb emplace_back #define all(x) (x).begin(), (x).end() #define sz(x) ((int)((x).size())) #define rep(i,n) for(int i=0; i<(n); ++i) #define rrep(i,n) for(int i=1; i<=(n); ++i) #define x first #define y second const int maxn = int(2e5) + 10; ll dp[maxn]; const ll inf = 1ll<<60; int n; vector<pp> a; int lev[maxn]; int levbef[maxn*2]; int bef[maxn]; int bx[maxn]; int nx[maxn]; ll pd[maxn]; void pre() { rep(i, n) { if (i) pd[i] = pd[i-1]; if (a[i].y) pd[i] += a[i].x; else pd[i] -= a[i].x; } int l = n; rep(i, n) { if (a[i].y) ++l; else --l; lev[i] = l; levbef[l] = -2; } levbef[n] = -1; int last[2] = {-1, -1}; rep(i, n) { int c = a[i].y, d = c^1; bef[i] = last[c]; bx[i] = last[d]; last[c] = i; } last[0] = last[1] = -1; for(int i=n-1; 0<=i; --i) { int c = a[i].y, d = c^1; nx[i] = last[d]; last[c] = i; } } ll min_total_length(vector<int> vr, vector<int> vb) { a.clear(); for(int x:vr) a.eb(x, 0); for(int x:vb) a.eb(x, 1); sort(all(a)); n = sz(a); pre(); fill(dp, dp+n, inf); { int p = nx[0]; for(int j=0; a[j].y == a[0].y; ++j) { int cnt = j+1; ll ps = abs(pd[j]); dp[j] = a[p].x * 1ll * cnt - ps; } } rep(i, n) { { int k = levbef[lev[i]]; if (k != -2) { ll df = abs(pd[i] - (k >= 0 ? pd[k] : 0ll)); ll tmp = (k >= 0 ? dp[k] : 0ll) + df; dp[i] = min(dp[i], tmp); } levbef[lev[i]] = i; } if (nx[i] != -1) { ll tmp = dp[i-1] + abs(a[nx[i]].x-a[i].x); dp[i] = min(dp[i], tmp); } if (bx[i] != -1) { ll tmp = ((bx[i] == i-1) ? dp[i-2] : dp[i-1]) + abs(a[bx[i]].x-a[i].x); dp[i] = min(dp[i], tmp); } if (i+1 < n && nx[i+1] != -1) { int j = nx[i+1]; ll ps = abs(pd[j-1]-pd[i]); int cnt = j-i-1; ll tmp = dp[i] + a[j].x * 1ll * cnt - ps; dp[j] = min(dp[j], tmp); } } return dp[n-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...