Submission #1197461

#TimeUsernameProblemLanguageResultExecution timeMemory
1197461HappyCapybaraWiring (IOI17_wiring)C++17
7 / 100
1095 ms7472 KiB
#include "wiring.h" #include<bits/stdc++.h> using namespace std; #define ll long long ll min_total_length(vector<int> r, vector<int> b){ int n = r.size(); int m = b.size(); vector<pair<int,int>> v; for (int i=0; i<n; i++) v.push_back({r[i], 0}); for (int i=0; i<m; i++) v.push_back({b[i], 1}); sort(v.begin(), v.end()); vector<int> bl(n+m); bl[0] = 1; for (int i=1; i<n+m; i++){ if (v[i].second == v[i-1].second) bl[i] = bl[i-1]+1; else bl[i] = 1; } vector<ll> ps(n+m+1, 0); for (int i=1; i<=n+m; i++) ps[i] = ps[i-1]+v[i-1].first; vector<ll> dp(n+m+1, 1ll<<50); dp[0] = 0; for (int i=0; i<n+m; i++){ if (bl[i] == i+1) continue; int lb = i-bl[i]; for (int j=0; j<bl[lb]; j++){ ll k = (ps[i+1]-ps[lb+1])-(ps[lb+1]-ps[lb-j]); if (bl[i] > j+1) k -= (bl[i]-(j+1))*v[lb].first; else k += ((j+1)-bl[i])*v[lb+1].first; //cout << i << " " << j << " " << k << endl; ll res; if (j == bl[lb]-1) res = k+min(dp[lb-j], dp[lb-j+1]); else res = k+dp[lb-j]; if (res > dp[i+1] && dp[i+1] != 1ll<<50) break; dp[i+1] = min(dp[i+1], res); } } 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...