Submission #1244419

#TimeUsernameProblemLanguageResultExecution timeMemory
1244419NekoRollyWerewolf (IOI18_werewolf)C++20
0 / 100
347 ms589824 KiB
#include<bits/stdc++.h> #include"werewolf.h" using namespace std; typedef vector<int> vi; const int N = 2e5+4; int n; vi adj[N]; bool vis1[N],vis2[N]; void dfs1(int u,int l,int r,bool vis[]){ if (u < l || r < u) return; vis[u] = true; for (int v : adj[u]) if (!vis[v]) dfs1(v, l, r, vis); } vi rec; void dfs2(int u,int p){ rec.push_back(u); for (int v : adj[u]) if (v != p) dfs2(v, u); } struct Sparce_Table{ int t[N][18],op; // 0:min 1:max int merge(int a,int b){ return op == 0 ? min(a, b) : max(a, b); } void build(int n,vi a,int _op){ op = _op; for (int i=0; i<n; i++) t[i][0] = a[i]; for (int j=0; j+1<18; j++) for (int i=0; i<n; i++) t[i][j+1] = merge(t[i][j], t[min(n-1, i+(1<<j))][j]); } int query(int l,int r){ int k = 31 - __builtin_clz(r-l+1); return merge(t[l][k], t[r-(1<<k)+1][k]); } } spt_max, spt_min; vi check_validity(int N,vi X,vi Y,vi S,vi E,vi L,vi R){ n = N; for (int i=0; i<X.size(); i++){ adj[X[i]].push_back(Y[i]); adj[Y[i]].push_back(X[i]); } int rt; for (int i=0; i<n; i++) if (adj[i].size() == 1) rt = i; dfs2(rt, -1); cout << "rec: "; for (int x : rec) cout << x << " "; cout << "\n"; int pos[n]; for (int i=0; i<n; i++) pos[rec[i]] = i; spt_max.build(n, rec, 1); spt_min.build(n, rec, 0); vi vans; for (int j=0; j<S.size(); j++){ int a = pos[S[j]], b = pos[E[j]]; if (a < b){ int l = a, r = n; while (l+1<r){ int m = (l+r)>>1; if (spt_min.query(a, m) >= L[j]) l = m; else r = m; } int aR = l; l = -1, r = b; while (l+1<r){ int m = (l+r)>>1; if (spt_max.query(m, b) <= R[j]) r = m; else l = m; } int bL = r; // cout << bL << " <= " << aR << "\n"; vans.push_back(bL <= aR); } else{ int l = b, r = n; while (l+1<r){ int m = (l+r)>>1; if (spt_max.query(b, m) <= R[j]) l = m; else r = m; } int bR = l; l = -1, r = a; while (l+1<r){ int m = (l+r)>>1; if (spt_min.query(m, a) >= L[j]) r = m; else l = m; } int aL = r; // cout << a << " a-b " << b << "\n"; // cout << aL << " <= " << bR << "\n"; vans.push_back(aL <= bR); } } return vans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...