Submission #530402

#TimeUsernameProblemLanguageResultExecution timeMemory
530402NachoLibreAliens (IOI16_aliens)C++17
4 / 100
2 ms460 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define vint vector<int> using namespace std; #ifndef x // #include ".h" #else #endif int n; vint l, r; ll p2(ll x) { return x * x; } ll I(int i) { if(r[i] < l[i + 1]) return 0; return p2(r[i] - l[i + 1] + 1); } ll P(array<ll, 3> p, ll x) { return p[0] * x + p[1]; } bool CW(array<ll, 2> a, array<ll, 2> b) { return (a[0] * b[1] - b[0] * a[1] < 0); } bool CW(array<ll, 3> a, array<ll, 3> b, array<ll, 3> c) { a[0] = b[0] - a[0]; a[1] = b[1] - a[1]; b[0] = c[0] - b[0]; b[1] = c[1] - b[1]; return CW({a[0], a[1]}, {b[0], b[1]}); } array<ll, 2> dpsol(ll am) { vector<array<ll, 2> > dp(n); dp[0] = {p2(r[0] - l[0] + 1) + am, 1}; deque<array<ll, 3> > d; int dg = 0; for(int i = 0; i < n; ++i) { // cout << i << " |\n"; if(i > 0) { ll x = -r[i]; ll c = p2(r[i] + 1) + am; // cout << "x, c: " << x << " " << c << endl; while(dg < sz(d) - 1 && P(d[dg + 1], x) < P(d[dg], x)) dg += 1; dp[i][0] = P(d[dg], x) + c; dp[i][1] = d[dg][2] + 1; // cout << "a', b': " << d[dg][0] << " " << d[dg][1] << endl; ll y = p2(r[i] - l[0] + 1) + am; if(dp[i][0] > y) { dp[i][0] = y; dp[i][1] = 1; } } // cout << "dp: " << dp[i][0] - 0 * dp[i][1] * am << " " << dp[i][1] << endl; if(i < n - 1) { ll a = 2ll * l[i + 1]; ll b = dp[i][0] - I(i) - 2ll * l[i + 1]; b += p2(l[i + 1]); // cout << "a, b: " << a << " " << b << endl; array<ll, 3> x = {a, b, dp[i][1]}; while(sz(d) >= 2 && CW(d[sz(d) - 2], d[sz(d) - 1], x)) { // cout << "popped: " << d.back()[0] << " " << d.back()[1] << endl; d.pop_back(); } d.push_back(x); dg = min(dg, sz(d) - 1); } } array<ll, 2> x = dp[n - 1]; x[0] -= x[1] * am; return x; } ll take_photos(int N, int m, int k, vint R, vint C) { n = N; vector<int> lg(m, m); for(int i = 0; i < n; ++i) { array<int, 2> x = {R[i], C[i]}; if(x[0] > x[1]) swap(x[0], x[1]); lg[x[1]] = min(lg[x[1]], x[0]); } vector<array<int, 2> > v; for(int i = 0; i < m; ++i) { if(lg[i] == m) continue; while(sz(v) && lg[i] <= v.back()[0]) { v.pop_back(); } v.push_back({lg[i], i}); } n = sz(v); l = r = vint(n); for(int i = 0; i < n; ++i) { l[i] = v[i][0]; r[i] = v[i][1]; } ll al = 0, ar = 1e9; // al = ar = 4; while(al < ar) { ll am = (al + ar) >> 1; if(dpsol(am)[1] > k) al = am + 1; else ar = am; } array<ll, 2> x = dpsol(al); // cout << x[1] << " " << al << endl; if(x[1] < k && al) assert(0); return x[0]; } #ifdef x int main() { ios::sync_with_stdio(0); cin.tie(0); cout << take_photos(4, 4, 2, {0, 1, 2, 3}, {0, 1, 2, 3}) << endl; // return 0; cout << take_photos(9, 9, 2, {0, 1, 2, 3, 4, 5, 6, 7, 8}, {0, 1, 2, 3, 4, 5, 6, 7, 8}) << endl; cout << "----" << endl; cout << take_photos(5, 5, 5, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}) << endl; cout << take_photos(5, 5, 4, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}) << endl; cout << take_photos(5, 5, 3, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}) << endl; cout << take_photos(5, 5, 2, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}) << endl; cout << take_photos(5, 5, 1, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}) << endl; cout << "----" << endl; cout << take_photos(2, 2, 1, {0, 1}, {0, 1}) << endl; cout << take_photos(2, 2, 2, {0, 1}, {0, 1}) << endl; cout << take_photos(1, 2, 1, {0}, {1}) << endl; cout << "----" << endl; cout << take_photos(5, 7, 1, {0, 4, 4, 4, 4}, {3, 4, 6, 5, 6}) << endl; cout << take_photos(5, 7, 2, {0, 4, 4, 4, 4}, {3, 4, 6, 5, 6}) << endl; cout << take_photos(2, 6, 2, {1, 4}, {4, 1}) << endl; return 0; } #endif
#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...