Submission #1248973

#TimeUsernameProblemLanguageResultExecution timeMemory
1248973CyanmondAliens (IOI16_aliens)C++20
0 / 100
0 ms328 KiB
#include "aliens.h" #include <bits/stdc++.h> using namespace std; using ll = long long; #define ALL(x) (x).begin(), (x).end() #define REP(i, l, r) for (int i = (l); i < (r); ++i) #define len(x) int(x.size()) ll pow2(ll v) { return v * v; } struct Line { ll a, b; ll eval(ll x) { return a * x + b; } }; struct CHT { // add: decrease // query: increase // query: min deque<Line> deq; void add(Line line) { if (not deq.empty() and deq.front().a == line.a) { if (deq.front().b < line.b) { return; } else { deq.pop_front(); } } while (len(deq) >= 2) { if (__int128_t(deq[0].a - line.a) * __int128_t(deq[1].b - deq[0].b) <= __int128_t(deq[0].b - line.b) * __int128_t(deq[1].a - deq[0].a)) { deq.pop_front(); } else { break; } } deq.push_front(line); } ll query(ll x) { while (len(deq) >= 2) { if (deq[len(deq) - 1].eval(x) >= deq[len(deq) - 2].eval(x)) { deq.pop_back(); } else { break; } } return deq.back().eval(x); ll mn = 1ll << 60; for (auto &line : deq) mn = min(mn, line.eval(x)); return mn; } }; long long take_photos(int n, int m, int K, std::vector<int> r, std::vector<int> c) { vector<pair<int, int>> pts(n); REP(i, 0, n) { if (r[i] > c[i]) { swap(r[i], c[i]); } pts[i] = make_pair(r[i], c[i]); } sort(ALL(pts)); { vector<pair<int, int>> pts2; REP(i, 0, n) { if (i != n - 1 and pts[i].first == pts[i + 1].first) { continue; } pts2.push_back(pts[i]); } pts = pts2; n = len(pts); } { vector<pair<int, int>> pts2; int mx_c = -1; REP(i, 0, n) { if (pts[i].second <= mx_c) { continue; } pts2.push_back(pts[i]); mx_c = max(mx_c, pts[i].second); } pts = pts2; n = len(pts); } auto relax = [&](ll lambda) { vector<ll> dp(n + 1, 1ll << 60); dp[0] = 0; CHT cht; REP(i, 0, n + 1) { if (i != 0) { ll x = pts[i - 1].second; ll mn = cht.query(x); ll res = mn + x * x + lambda; dp[i] = res; } if (i == n) { continue; } ll a = 2 * (-pts[i].first + 1); ll diff = pow2(max(0ll, i == 0 ? 0ll : (pts[i - 1].second - pts[i].first + 1))); ll b = dp[i] + pow2(-pts[i].first + 1) - diff; cht.add({a, b}); } return dp[n] - lambda * K; }; ll lo = -(1ll << 40), hi = 1ll << 40; while (hi - lo > 3) { ll m1 = (2 * lo + hi) / 3; ll m2 = (lo + 2 * hi) / 3; if (relax(m1) > relax(m2)) { hi = m2 - 1; } else { lo = m1 + 1; } } cerr << hi << ' ' << lo << endl; ll ans = -1; for (ll lambda = lo; lambda <= hi; ++lambda) { ans = max(ans, relax(lambda)); } return ans; }

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...