Submission #926478

#TimeUsernameProblemLanguageResultExecution timeMemory
926478math_rabbit_1028Pyramid Base (IOI08_pyramid_base)C++14
0 / 100
4889 ms262144 KiB
#include <bits/stdc++.h> #define fi first #define se second using namespace std; typedef pair<int, int> pii; typedef long long ll; int M, N, P; array<int, 5> arr[404040]; ll B; struct segtree { int tree[1<<21], lazy[1<<21]; void init(int v, int st, int ed) { if (st == ed) { tree[v] = 0; lazy[v] = 0; return; } int mid = (st+ed)/2; init(2*v, st, mid); init(2*v+1, mid+1, ed); tree[v] = min(tree[2*v], tree[2*v+1]); lazy[v] = 0; } void prop(int v, int st, int ed) { tree[v] += lazy[v]; if (st != ed) { lazy[2*v] += lazy[v]; lazy[2*v+1] += lazy[v]; } lazy[v] = 0; } void update(int v, int st, int ed, int lt, int rt, int val) { prop(v, st, ed); if (lt > ed || st > rt) return; if (lt <= st && ed <= rt) { lazy[v] = val; prop(v, st, ed); return; } int mid = (st+ed)/2; update(2*v, st, mid, lt, rt, val); update(2*v+1, mid+1, ed, lt, rt, val); tree[v] = min(tree[2*v], tree[2*v+1]); cout << st << " " << ed << " " << lt << " " << rt << " " << tree[v] << " " << tree[2*v] << " " << tree[2*v+1] << "\n"; } int get(int v, int st, int ed, int lt, int rt) { prop(v, st, ed); if (lt > ed || st > rt) return 1e9; if (lt <= st && ed <= rt) return tree[v]; int mid = (st+ed)/2; return min(get(2*v, st, mid, lt, rt), get(2*v+1, mid+1, ed, lt, rt)); } } seg; vector<pii> add[1010101], rem[1010101]; bool solve(int L) { cout << "length: " << L << "\n"; for (int i = 0; i <= M; i++) add[i].clear(); for (int i = 0; i <= M; i++) rem[i].clear(); seg.init(1, 0, N-L); for (int i = 1; i <= P; i++) { cout << arr[i][0]-L << " " << arr[i][2]-1 << " "; cout << arr[i][1]-L << " " << arr[i][3]-1 << "\n"; if (arr[i][0]-L < 0) seg.update(1, 0, N-L, arr[i][1]-L, arr[i][3]-1, +1); else add[arr[i][0]-L].push_back({arr[i][1]-L, arr[i][3]-1}); rem[arr[i][2]].push_back({arr[i][1]-L, arr[i][3]-1}); } for (int i = 0; i <= M-L; i++) { for (auto &[l, r] : add[i]) seg.update(1, 0, N-L, l, r, +1); for (auto &[l, r] : rem[i]) seg.update(1, 0, N-L, l, r, -1); if (seg.get(1, 0, N-L, 0, N-L) == 0) return true; } //for (int i = 0; i <= N-L; i++) cout << i << " " << seg.get(1, 0, N-L, i, i) << "\n"; cout << N-L << " " << seg.get(1, 0, N-L, 0, N-L) << "\n"; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> M >> N; cin >> B >> P; for (int i = 1; i <= P; i++) { cin >> arr[i][0] >> arr[i][1] >> arr[i][2] >> arr[i][3] >> arr[i][4]; } int st = 0, ed = min(M, N); while (st < ed) { int mid = (st+ed+1)/2; if (solve(mid)) st = mid; else ed = mid-1; } cout << st << "\n"; return 0; }

Compilation message (stderr)

pyramid_base.cpp: In function 'bool solve(int)':
pyramid_base.cpp:72:20: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   72 |         for (auto &[l, r] : add[i]) seg.update(1, 0, N-L, l, r, +1);
      |                    ^
pyramid_base.cpp:73:20: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   73 |         for (auto &[l, r] : rem[i]) seg.update(1, 0, N-L, 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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...