제출 #465338

#제출 시각아이디문제언어결과실행 시간메모리
465338AmShZThe short shank; Redemption (BOI21_prison)C++17
100 / 100
1993 ms318864 KiB
//khodaya khodet komak kon #pragma GCC optimize("O2") # include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair <int, int> pii; typedef pair <pii, int> ppi; typedef pair <int, pii> pip; typedef pair <pii, pii> ppp; typedef pair <ll, ll> pll; # define A first # define B second # define endl '\n' # define sep ' ' # define all(x) x.begin(), x.end() # define kill(x) return cout << x << endl, 0 # define SZ(x) int(x.size()) # define lc id << 1 # define rc id << 1 | 1 # define fast_io ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); ll power(ll a, ll b, ll md) {return (!b ? 1 : (b & 1 ? a * power(a * a % md, b / 2, md) % md : power(a * a % md, b / 2, md) % md));} const int xn = 2e6 + 10; const int xm = - 20 + 10; const int sq = 320; const int inf = 1e9 + 10; const ll INF = 1e18 + 10; const ld eps = 1e-15; const int mod = 1e9 + 7;//998244353; const int base = 257; int n, D, T, a[xn], L[xn], ans = - 1, stm[xn]; int par[xn], ftm[xn], TM, m = 1, P[xn], lazy[xn << 2]; pii seg[xn << 2]; set <int> st; vector <int> Q[xn], adj[xn]; bool mark[xn]; void solve(int v = 1, int l = 1, int r = n + 1){ if (r <= l) return; int pt = r - 1; while (l <= pt){ if (L[pt] == pt || !L[pt]){ ans += !L[pt]; -- pt; continue; } adj[v].push_back(++ m); solve(m, L[pt], pt); pt = L[pt] - 1; } } void preDFS(int v){ P[TM] = v; stm[v] = TM ++; for (int u : adj[v]) par[u] = v, preDFS(u); ftm[v] = TM; } void shift(int id, int l, int r){ if (!lazy[id]) return; seg[id].A += lazy[id]; if (1 < r - l){ lazy[lc] += lazy[id]; lazy[rc] += lazy[id]; } lazy[id] = 0; } void update(int id, int l, int r, int ql, int qr, int val){ shift(id, l, r); if (qr <= l || r <= ql || qr <= ql) return; if (ql <= l && r <= qr){ lazy[id] += val; shift(id, l, r); return; } int mid = l + r >> 1; update(lc, l, mid, ql, qr, val); update(rc, mid, r, ql, qr, val); seg[id] = max(seg[lc], seg[rc]); } void build(int id, int l, int r){ if (r - l == 1){ seg[id].B = P[l]; return; } int mid = l + r >> 1; build(lc, l, mid), build(rc, mid, r); seg[id] = seg[lc]; } int main(){ fast_io; cin >> n >> D >> T; if (n == 1){ if (a[1] <= T) kill(1); kill(0); } for (int i = 1; i <= n; ++ i){ cin >> a[i]; if (a[i] <= T){ st.insert(- i); Q[min(n, i + T - a[i])].push_back(i); } if (SZ(st)) L[i] = - *st.begin(); for (int x : Q[i]) st.erase(- x); } solve(); preDFS(1); build(1, 0, TM); for (int i = 1; i <= m; ++ i) update(1, 0, TM, stm[i], ftm[i], 1); while (D --){ int v = seg[1].B; if (seg[1].A < 1) break; while (!mark[v] && v){ mark[v] = true; ++ ans; update(1, 0, TM, stm[v], ftm[v], - 1); v = par[v]; } } cout << n - ans << endl; return 0; }

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

prison.cpp: In function 'void update(int, int, int, int, int, int)':
prison.cpp:85:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |  int mid = l + r >> 1;
      |            ~~^~~
prison.cpp: In function 'void build(int, int, int)':
prison.cpp:95:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   95 |  int mid = 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...