제출 #991513

#제출 시각아이디문제언어결과실행 시간메모리
991513Muaath_59월 (APIO24_september)C++17
100 / 100
588 ms16092 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> using namespace std; const int N = 1e5+1; int tree[4*N]; void update(int idx, int l = 0, int r = N-1, int node=1) { if (l == r) { tree[node] = 1; return; } const int mid = (l+r)/2; if (idx <= mid) update(idx, l, mid, node*2); else update(idx, mid+1, r, node*2+1); tree[node] = tree[node*2] + tree[node*2+1]; } int range_sum(int ql, int qr, int l = 0, int r = N-1, int node=1) { if (ql <= l && r <= qr) return tree[node]; if (l > qr || r < ql) return 0; const int mid = (l+r)/2; return range_sum(ql, qr, l, mid, node*2) + range_sum(ql, qr, mid+1, r, node*2+1); } vector<int> adj[N]; int ttm, dt[N], ft[N]; void dfs(int node) { dt[node] = ttm++; for (int ch : adj[node]) { dfs(ch); } ft[node] = ttm-1; } int ismad(int node) { return range_sum(dt[node], ft[node]) < ft[node] - dt[node] + 1; } int solve(int n, int m, std::vector<int> P, std::vector<std::vector<int>> S) { memset(tree, 0, sizeof tree); ttm = 0; for (int i = 0; i < n; i++) { adj[i].clear(); } for (int i = 1; i < n; i++) { adj[P[i]].push_back(i); } dfs(0); int days = 0; int idx = 0; int madcnt = 0; while (idx < n-1) { do { for (int i = 0; i < m; i++) { // append S[i][idx] if not appended if (range_sum(dt[S[i][idx]], dt[S[i][idx]]) == 0) { update(dt[S[i][idx]]); int node = S[i][idx]; if (ismad(node)) { madcnt++; } else { while (node != 0 && !ismad(P[node])) { madcnt--; node = P[node]; } } } } idx++; } while (idx < n-1 && (range_sum(0, n) != idx || madcnt)); days++; } return days; } #ifdef MUAATH_5 int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cout << solve(3, 1, {-1, 0, 0}, {{1, 2}}) << '\n'; cout << solve(5, 2, {-1, 0, 0, 1, 1}, {{1, 2, 3, 4}, {4, 1, 2, 3}}) << '\n'; cout << solve(7, 1, {-1, 0, 0, 1, 1, 3, 3}, {{3, 1, 4, 6, 2}}) << '\n'; } #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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...