Submission #1206866

#TimeUsernameProblemLanguageResultExecution timeMemory
1206866catlingAliens (IOI16_aliens)C++20
0 / 100
0 ms328 KiB
#include "aliens.h" #include <vector> #include <algorithm> #include <limits> long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) { using ll = long long; const ll INF = (ll)1e18; std::vector<std::pair<int,int>> pts(n); for (int i = 0; i < n; ++i) pts[i] = { std::min(r[i], c[i]), std::max(r[i], c[i]) }; std::sort(pts.begin(), pts.end()); std::vector<ll> A(n+1), B(n+1); for (int i = 1; i <= n; ++i) { A[i] = pts[i-1].first; B[i] = pts[i-1].second; } std::vector<ll> seg(4*(n+1), -INF); auto build = [&](auto&& self, int idx, int L, int R)->void{ if (L == R) seg[idx] = B[L]; else { int M = (L+R)/2; self(self, idx*2, L, M); self(self, idx*2+1, M+1, R); seg[idx] = std::max(seg[idx*2], seg[idx*2+1]); } }; build(build, 1, 1, n); auto query = [&](auto&& self, int idx, int L, int R, int ql, int qr)->ll { if (qr < L || R < ql) return -INF; if (ql <= L && R <= qr) return seg[idx]; int M = (L+R)/2; return std::max( self(self, idx*2, L, M, ql, qr), self(self, idx*2+1, M+1, R, ql, qr) ); }; std::vector<ll> dp(n+1), best(n+1); std::vector<int> cnt(n+1), bestCnt(n+1); ll lambda = 0; auto solveDC = [&](auto&& self, int L, int R, int optL, int optR)->void { if (L > R) return; int mid = (L+R)/2; ll bestVal = INF; int bestK=-1, bestSeg=0; int ub = std::min(optR, mid-1); for (int j = optL; j <= ub; ++j) { ll mx = query(query,1,1,n,j+1,mid); ll len = mx - A[j+1] + 1; ll cost = len*len + lambda; ll cand = dp[j] + cost; int segs = cnt[j] + 1; if (cand < bestVal || (cand==bestVal && segs<bestSeg)) { bestVal = cand; bestSeg = segs; bestK = j; } } best[mid] = bestVal; bestCnt[mid] = bestSeg; self(self, L, mid-1, optL, bestK); self(self, mid+1,R, bestK, optR); }; auto runWith = [&](ll lam)->std::pair<ll,int> { lambda = lam; std::fill(dp.begin(), dp.end(), INF); std::fill(cnt.begin(), cnt.end(), 0); dp[0]=0; cnt[0]=0; solveDC(solveDC, 1, n, 0, n-1); return { best[n], bestCnt[n] }; }; ll lo = 0, hi = 4LL*m*m + 10; while (lo < hi) { ll mid = (lo+hi)/2; auto [val, used] = runWith(mid); if (used > k) lo = mid + 1; else hi = mid; } auto [finalVal, finalUsed] = runWith(lo); return finalVal - lo * finalUsed; }

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...