Submission #290418

#TimeUsernameProblemLanguageResultExecution timeMemory
290418SaboonAliens (IOI16_aliens)C++17
41 / 100
2081 ms3440 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5 + 5, maxm = 1e6 + 5; int n, m, k; const ll inf = 1e18; int Cmq[maxm][20]; ll dp[maxm], pd[maxm], opt[maxm]; int get(int l, int r){ int len = (r-l+1); len = log2(len); return min(Cmq[l][len], Cmq[r-(1<<len)+1][len]); } vector<pair<int,int>> A; pair<ll,ll> solve(ll x){ int sz = A.size(); for (int i = 0; i < sz; i++){ dp[i] = inf; for (int j = 0; j <= i; j++){ ll Q = A[i].second-A[j].first+1; ll Cost = Q*Q; ll Add = 0; ll cnt = 1; if (j != 0){ cnt += pd[j-1]; Add += dp[j-1]; int r = A[j].first, c = A[j-1].second; ll P = max(0,(c-r+1)); Add -= P*P; } if (make_pair(Cost+Add+x,cnt) < make_pair(dp[i],pd[i])) dp[i] = Cost+Add+x, pd[i] = cnt, opt[i] = j; } } for (int i = 0; i < sz-1; i++) assert(opt[i] <= opt[i+1]); return {dp[sz-1],pd[sz-1]}; } ll take_photos(int n, int m, int k, vector<int> r, vector<int> c){ ::n = n, ::m = m, ::k = k; for (int i = 0; i < n; i++) if (r[i] > c[i]) swap(r[i],c[i]); vector<pair<int,int>> Tmp; for (int i = 0; i < n; i++) Tmp.push_back({r[i],c[i]}); sort(Tmp.begin(),Tmp.end()); for (int i = 0; i < n; i++){ if (!A.empty() and A.back().first == Tmp[i].first){ A.pop_back(); A.push_back(Tmp[i]); } else if (A.empty() or A.back().second < Tmp[i].second) A.push_back(Tmp[i]); } ll lo = -1, hi = 1e12 + 1; while (hi-lo > 1){ ll mid = (lo+hi) >> 1; if (solve(mid).second > k) lo = mid; else hi = mid; } auto it = solve(hi); return it.first - hi*k; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...