Submission #1280532

#TimeUsernameProblemLanguageResultExecution timeMemory
1280532nicolo_010송신탑 (IOI22_towers)C++20
23 / 100
4093 ms7008 KiB
#include <bits/stdc++.h> #include "towers.h" using namespace std; using ll = long long; using pii = pair<int, int>; vector<int> h; struct SegTree { vector<int> tree; SegTree(int n) { tree.assign(4*n, 0); } void query(int p, int l, int r, int i, int x) { if (l > i || r < i) return; if (l==r && r==i) { tree[p] = x; return; } int m = (l+r)/2; query(2*p, l, m, i, x); query(2*p+1, m+1, r, i, x); int i1 = tree[2*p]; int i2 = tree[2*p+1]; tree[p] = max(i1, i2); } int rmq(int p, int l, int r, int i, int j) { if (l > j || r < i) return 0; if (i <= l && r <= j) { return tree[p]; } int m = (l+r)/2; int i1 = rmq(2*p, l, m, i, j); int i2 = rmq(2*p+1, m+1, r, i, j); return max(i1, i2); } int walkleft(int p, int l, int r, int x) { if (l==r) return l; int m = (l+r)/2; if (tree[2*p+1] >= x) { return walkleft(2*p+1, m+1, r, x); } else { return walkleft(2*p, l, m, x); } } int walkright(int p, int l, int r, int x) { if (l==r) return l; int m = (l+r)/2; if (tree[2*p] >= x) { return walkright(2*p, l, m, x); } else { return walkright(2*p+1, m+1, r, x); } } }; void init(int N, vector<int> H) { h = H; } bool cmp(int a, int b) { return h[a] < h[b]; } int max_towers(int l, int r, int d) { int n = h.size(); vector<int> L(n, 0), R(n, n-1); SegTree mx(n); for (int i=0; i<n; i++) { L[i] = mx.walkleft(1, 0, n-1, h[i]+d); mx.query(1, 0, n-1, i, h[i]); } mx = SegTree(n); for (int i=n-1; i>=0; i--) { R[i] = mx.walkright(1, 0, n-1, h[i]+d); mx.query(1, 0, n-1, i, h[i]); } vector<int> towers; for (int i=l; i <= r; i++) { towers.push_back(i); } sort(towers.begin(), towers.end(), cmp); SegTree st(n); int cnt=0; int m = towers.size(); for (int k=0; k<m; k++) { int i = towers[k]; int i1 = st.rmq(1, 0, n-1, L[i], i); int i2 = st.rmq(1, 0, n-1, i, R[i]); if (i1 == i2 && i2 == 0) { cnt++; st.query(1, 0, n-1, i, 1); } } return cnt; }
#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...