제출 #578013

#제출 시각아이디문제언어결과실행 시간메모리
578013AugustinasJucas전선 연결 (IOI17_wiring)C++14
17 / 100
1094 ms12972 KiB
#include <bits/stdc++.h> using namespace std; #include "wiring.h" int n; const long long inf = 1e18; vector<int> groupInd; vector<pair<int, int> > interv; vector<pair<int, int> > groups; vector<long long> toRight, toLeft; vector<long long> ikiL, ikiR; long long f(int l, int r) { int prm = groups[l].second; int ant = groups[r].second; long long kekL = 0, kekR = 0; long long maxL = 0, minR = 1e9; long long sumL = 0, sumR = 0; for(int i = l; i <= r; i++) { kekL += (groups[i].second == prm); kekR += (groups[i].second == ant); if(groups[i].second == prm) { sumL += groups[i].first; maxL = max(maxL, 1ll * groups[i].first); }else { sumR += groups[i].first; minR = min(minR, 1ll * groups[i].first); } } long long ret = 0; ret += toRight[l]; ret += toLeft[r]; ret += (minR - maxL) * max(ikiR[l], ikiL[r]); return ret; } void calcToLeft(int l, int r) { for(int i = l; i <= r; i++) { toLeft[i] = (i == l ? 0ll : toLeft[i-1]) + groups[i].first - groups[l].first; ikiL[i] = i - l + 1; } } void calcToRight(int l, int r) { for(int i = r; i >= l; i--) { toRight[i] = (i == r ? 0ll : toRight[i+1]) + groups[r].first - groups[i].first; ikiR[i] = r - i + 1; } } long long min_total_length(vector<int> r, vector<int> b) { n = r.size() + b.size(); for(auto &x : r) { groups.push_back({x, 0}); } for(auto &x : b) { groups.push_back({x, 1}); } groupInd.resize(n); toLeft.resize(n); toRight.resize(n); ikiL.resize(n); ikiR.resize(n); sort(groups.begin(), groups.end()); for(int i = 0; i < n; i++) { for(int j = i; j <= n; j++) { if(j == n || groups[j].second != groups[i].second) { int l = i; int r = j-1; interv.push_back({l, r}); for(int h = l; h <= r; h++) { groupInd[h] = (int) interv.size()-1; } i = j-1; calcToLeft(l, r); calcToRight(l, r); break; } } } /* cout << "intervalai: "; for(auto &x : interv) { cout << "(" << x.first << ", " << x.second << "), "; } cout << endl;*/ vector<long long> dp(n, inf); // dp[-1] = 0; for(int i = interv[1].first; i < n; i++) { int myInterv = groupInd[i]; // cout << "skaiciuoju dp[" << i << "], manoInterv = " << myInterv << ":" << endl; dp[i] = dp[interv[myInterv-1].second] + f(interv[myInterv-1].second, i); for(int j = interv[myInterv-1].first; j <= interv[myInterv-1].second; j++) { dp[i] = min(dp[i], (j == 0 ? 0ll : dp[j-1]) + f(j, i)); // cout << "gali buti (nuo " << j << ") " << (j == 0 ? 0ll : dp[j-1]) << " + f(" << j << ", " << i << ") = " << f(j, i) << endl; } // cout << "dp[" << i << "] = " << dp[i] << endl << endl; } 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...