Submission #996572

#TimeUsernameProblemLanguageResultExecution timeMemory
996572Shayan86September (APIO24_september)C++17
100 / 100
555 ms23828 KiB
#include "september.h" #include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") // Ofast, O0, O1, O2, O3, unroll-loops, fast-math, trapv typedef long long ll; typedef pair<ll, ll> pll; typedef pair<int, int> pii; #define Mp make_pair #define sep ' ' #define endl '\n' #define F first #define S second #define pb push_back #define SZ(x) (int)x.size() #define all(x) (x).begin(),(x).end() #define kill(res) cout << res << '\n', exit(0); #define set_dec(x) cout << fixed << setprecision(x); #define fast_io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define file_io freopen("input.txt", "r", stdin) ; freopen("output.txt", "w", stdout); //! segment #define lid (id*2) #define rid (id*2+1) #define mid ((l+r)/2) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const ll N = 1e5 + 50; const ll inf = 1e9 + 7; int n, m, st[N], ft[N], timer; vector<int> adj[N]; void dfs(int v){ st[v] = timer++; for(int u: adj[v]) dfs(u); ft[v] = timer; } int seg[N*4], lz[N*4]; void quex(int id, int x){ seg[id] += x; lz[id] += x; } void relax(int id){ quex(lid, lz[id]); quex(rid, lz[id]); lz[id] = 0; } int get(int s, int t, int l = 0, int r = n, int id = 1){ if(s <= l && r <= t) return seg[id]; if(t <= l || r <= s) return 0; relax(id); return max(get(s, t, l, mid, lid), get(s, t, mid, r, rid)); } void upd(int s, int t, int x, int l = 0, int r = n, int id = 1){ if(s <= l && r <= t){ quex(id, x); return; } if(t <= l || r <= s) return; relax(id); upd(s, t, x, l, mid, lid); upd(s, t, x, mid, r, rid); seg[id] = max(seg[lid], seg[rid]); } set<int> ms; int solve(int N, int M, std::vector<int> F, std::vector<std::vector<int>> S) { n = N; m = M; ms.clear(); timer = 0; fill(seg, seg + (n+20) * 4, 0); fill(lz, lz + (n+20) * 4, 0); for(int i = 0; i < n; i++) adj[i].clear(); for(int i = 1; i < n; i++) adj[F[i]].pb(i); dfs(0); int res = 0; for(int i = 0; i < n-1; i++){ for(int j = 0; j < m; j++) ms.insert(S[j][i]); upd(st[S[0][i]], ft[S[0][i]], 1); upd(st[S[0][i]], st[S[0][i]]+1, -inf); if(SZ(ms) == i+1 && get(0, n) <= 0) res++; } 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...