제출 #1024310

#제출 시각아이디문제언어결과실행 시간메모리
1024310dbenceAliens (IOI16_aliens)C++14
100 / 100
1915 ms74800 KiB
#include "aliens.h" #include <bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt") #define xx first #define yy second #define l(x) (x << 1) + 1 #define r(x) (x << 1) + 2 using namespace std; typedef long long ll; const ll N = 1e5 + 1; const ll M = 1e6 + 1; const ll inf = 1ll << 60; ll n, m, k, lef[M], xs[N], ans[M]; struct Node { ll l, r; ll a, b; } node[M << 2]; struct Change { ll id; ll a, b; }; vector <Change> changes[N]; ll eval(ll a, ll b, ll x) { return 1ll * a * xs[x] + b; } void update(ll id, ll a, ll b, vector <Change> &changes) { ll q = node[id].l + node[id].r >> 1; ll l = node[id].l; if (eval(node[id].a, node[id].b, q) > eval(a, b, q)) { swap(node[id].a, a); swap(node[id].b, b); changes.push_back({id, a, b}); } if (node[id].l == node[id].r) { return; } if (eval(node[id].a, node[id].b, l) > eval(a, b, l)) { update(l(id), a, b, changes); } else { update(r(id), a, b, changes); } } ll query(ll id, ll x) { ll f = eval(node[id].a, node[id].b, x); if (node[id].l == node[id].r) { return f; } ll q = node[id].l + node[id].r >> 1; if (x <= q) { return min(f, query(l(id), x)); } else { return min(f, query(r(id), x)); } } void build(ll id, ll l, ll r) { node[id].l = l; node[id].r = r; node[id].a = 0; node[id].b = inf; if (l == r) { return; } ll q = node[id].l + node[id].r >> 1; build(l(id), l, q); build(r(id), q + 1, r); } ll calc(ll lambda) { stack <pair <ll, ll>> st; for (ll i = 0; i < n; ++i) { changes[i].clear(); } fill(ans, ans + M, 0); build(0, 0, n - 1); auto rollback = [&](ll i) { for (auto [id, a, b]: changes[i]) { node[id].a = a; node[id].b = b; } }; ll res = 0; for (int j = 0; j < n; ++j) { ll i = xs[j]; if (j && i == xs[j - 1]) { continue; } while (!st.empty() && st.top().yy > lef[i]) { rollback(st.top().xx); st.pop(); } ll p = st.empty()? 0: xs[st.top().xx]; ll l = lef[i]; update(0, -2 * (l - 1), (l - 1) * (l - 1) + ans[p] - max(0ll, p - l + 1) * max(0ll, p - l + 1), changes[j]); st.push({j, lef[i]}); res = ans[i] = lambda + i * i + query(0, j); } return res - k * lambda; } ll ternary_search(ll l, ll r) { if (r <= l + 1) { return max(calc(l), calc(r)); } ll q = l + r >> 1; if (calc(q) > calc(q + 1)) { return ternary_search(l, q); } else { return ternary_search(q + 1, r); } } ll take_photos(int n_, int m_, int k_, std::vector<int> r, std::vector<int> c) { n = n_, m = m_, k = k_; for (ll i = 1; i <= m; ++i) { lef[i] = i + 1; } for (ll i = 0; i < n; ++i) { r[i]++, c[i]++; ll x = max(r[i], c[i]); ll y = min(r[i], c[i]); lef[x] = min(lef[x], y); xs[i] = x; } sort(xs, xs + n); ll res = ternary_search(0, 1ll * m * m); return res; }

컴파일 시 표준 에러 (stderr) 메시지

aliens.cpp: In function 'void update(ll, ll, ll, std::vector<Change>&)':
aliens.cpp:35:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   35 |     ll q = node[id].l + node[id].r >> 1;
      |            ~~~~~~~~~~~^~~~~~~~~~~~
aliens.cpp: In function 'll query(ll, ll)':
aliens.cpp:57:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   57 |     ll q = node[id].l + node[id].r >> 1;
      |            ~~~~~~~~~~~^~~~~~~~~~~~
aliens.cpp: In function 'void build(ll, ll, ll)':
aliens.cpp:73:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   73 |     ll q = node[id].l + node[id].r >> 1;
      |            ~~~~~~~~~~~^~~~~~~~~~~~
aliens.cpp: In lambda function:
aliens.cpp:87:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   87 |         for (auto [id, a, b]: changes[i]) {
      |                   ^
aliens.cpp: In function 'll ternary_search(ll, ll)':
aliens.cpp:117:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  117 |     ll q = l + r >> 1;
      |            ~~^~~
#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...