제출 #1177886

#제출 시각아이디문제언어결과실행 시간메모리
1177886trashaccount9월 (APIO24_september)C++20
100 / 100
366 ms17928 KiB
#include "september.h" #include <bits/stdc++.h> using namespace std; const int NM = 1e5; struct segtree{ int data[4*NM+5]; void build(int id, int l, int r){ data[id] = -1; if (l == r) return; int mid = (l+r)/2; build(2*id, l, mid); build(2*id+1, mid+1, r); } void update(int id, int l, int r, int i, int val){ if (i < l || i > r) return; if (l == r){ data[id] = max(data[id], val); return; } int mid = (l+r)/2; update(2*id, l, mid, i, val); update(2*id+1, mid+1, r, i, val); data[id] = max(data[2*id], data[2*id+1]); } int get(int id, int l, int r, int u, int v){ if (u > v || v < l || u > r) return -1; if (l >= u && r <= v) return data[id]; int mid = (l+r)/2; return max(get(2*id, l, mid, u, v), get(2*id+1, mid+1, r, u, v)); } } ST1, ST2; int N, M; vector <int> son[NM+5]; int timer, tin[NM+5], tout[NM+5]; int sum[NM+5], res[NM+5]; void dfs(int u){ tin[u] = ++timer; for (int v : son[u]) dfs(v); tout[u] = timer; } int solve(int _N, int _M, vector <int> F, vector <vector <int> > S){ N = _N, M = _M; for (int i = 0; i < N; i++) son[i].clear(); for (int i = 1; i < N; i++){ int p = F[i]; son[p].push_back(i); } timer = 0; dfs(0); for (int i = 0; i < M; i++){ for (int j = 1; j <= 4*N; j++){ ST1.data[j] = -1; ST2.data[j] = -1; } for (int j = 0; j < N; j++) sum[j] = 0; for (int j = N-2; j >= 0; j--){ int u = S[i][j]; int k = ST1.get(1, 1, N, tin[u], tout[u]); if (k > j) sum[j]++, sum[k]--; if (i > 0){ k = ST2.get(1, 1, N, 1, res[u]); if (k > j) sum[j]++, sum[k]--; } ST1.update(1, 1, N, tin[u], j); ST2.update(1, 1, N, res[u], j); } res[S[i][0]] = 1; for (int j = 0; j < N-2; j++){ if (j > 0) sum[j] += sum[j-1]; if (sum[j] > 0) res[S[i][j+1]] = res[S[i][j]]; else res[S[i][j+1]] = res[S[i][j]]+1; } } int mx = 0; for (int i = 1; i < N; i++) mx = max(mx, res[i]); return mx; }
#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...