Submission #1202462

#TimeUsernameProblemLanguageResultExecution timeMemory
1202462ElayV13September (APIO24_september)C++20
55 / 100
1094 ms19908 KiB
#include "september.h" #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 1;; const int INF = INT_MAX; vector < int > adj[N]; int idx[N] , sub[N] , arc[N]; int cur_idx = 0; void dfs(int v , int p) { sub[v] = 1; idx[v] = ++cur_idx; arc[idx[v]] = v; for(int u : adj[v]) { if(u != p) { dfs(u , v); sub[v] += sub[u]; } } } bool is_anc(int u , int v) { if(idx[v] >= idx[u] && idx[u] + sub[u] - 1 >= idx[v]) return true; return false; } void fix(int n) { for(int i = 0;i <= n;i++) adj[i].clear() , idx[i] = 0 , sub[i] = 0; cur_idx = 0; } int solve(int n , int m , vector < int > F , vector < vector < int > > S) { for(int i = 1;i <= n - 1;i++) { adj[i].push_back(F[i]); adj[F[i]].push_back(i); } dfs(0 , -1); int res = 0; vector < vector < int > > cur(m); vector < vector < int > > next(m , vector < int > (n + 1 , INF)); for(int i = 0;i < m;i++) { set < int > st; for(int v = 1;v <= n - 1;v++) st.insert(idx[v]); for(int j = 0;j < S[i].size();j++) { int l = idx[S[i][j]]; int r = idx[S[i][j]] + sub[S[i][j]] - 1; if(!st.size()) break; if(l > *st.rbegin()) continue; auto it = st.lower_bound(l); vector < int > rm; while(it != st.end()) { int fi = *it; if(fi <= r) { next[i][arc[fi]] = j; rm.push_back(fi); } else break; it++; } for(int ind : rm) st.erase(ind); } } for(int i = 0;i < S[0].size();i++) { for(int j = 0;j < m;j++) cur[j].push_back(S[j][i]); for(int j = 0;j < m;j++) sort(cur[j].begin() , cur[j].end()); set < vector < int > > st; for(int j = 0;j < m;j++) st.insert(cur[j]); if(st.size() != 1) continue; bool can = 1; for(int j = 0;j < m;j++) { int mn = INF; for(int k = i + 1;k < S[j].size();k++) { mn = min(mn , next[j][S[j][k]]); } if(mn <= i) can = 0; } if(can) { ++res; for(int j = 0;j < m;j++) cur[j].clear(); } } fix(n); return res; }
#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...