제출 #962581

#제출 시각아이디문제언어결과실행 시간메모리
962581MinaRagy06Aliens (IOI16_aliens)C++17
25 / 100
2094 ms604 KiB
#include <bits/stdc++.h> #include "aliens.h" #ifdef MINA #include "grader.cpp" #endif using namespace std; #define ll long long #define sz(x) (int) x.size() const int N = 100'005; const ll inf = 1e18; array<ll, 2> dp[N]; ll take_photos(int n, int crap, int m, vector<int> R, vector<int> C) { array<ll, 2> A[n + 1]; vector<ll> v; for (int i = 1; i <= n; i++) { A[i] = {R[i - 1], C[i - 1]}; if (A[i][0] > A[i][1]) swap(A[i][0], A[i][1]); } sort(A + 1, A + n + 1, [&] (array<ll, 2> x, array<ll, 2> y) {return make_pair(x[0], -x[1]) < make_pair(y[0], -y[1]);}); multiset<ll> s; vector<array<ll, 2>> a = {{0, 0}}; for (int i = 1; i <= n; i++) { while (s.size() && *s.begin() < A[i][0]) s.erase(s.begin()); if (s.size() && A[i][1] <= *s.rbegin()) continue; a.push_back({A[i][0], A[i][1]}); s.insert(A[i][1]); } n = a.size() - 1; ll prf[n + 2]{}; prf[1] = -1e18; for (int i = 1; i <= n; i++) { prf[i + 1] = max(prf[i], a[i][1]); a[i][0]--; prf[i] = max(prf[i], a[i][0]); a[i][0] *= -2; } auto check = [&] (ll c) { for (int i = 1; i <= n; i++) { dp[i] = {inf, inf}; } dp[0] = {0, 0}; for (int i = 1; i <= n; i++) { for (int k = i; k >= 1; k--) { ll cost = a[i][1] * a[k][0] - prf[k] * (prf[k] + a[k][0]); array<ll, 2> val = dp[k - 1]; val[0] += cost; val[1]++; dp[i] = min(dp[i], val); } dp[i][0] += a[i][1] * a[i][1] + c; } return dp[n][1] <= m; }; ll l = 0, r = inf; while (l <= r) { ll md = ((l + r) >> 1); if (check(md)) { r = md - 1; } else { l = md + 1; } } ll k = l; check(k); return dp[n][0] - k * 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...
#Verdict Execution timeMemoryGrader output
Fetching results...