Submission #1266272

#TimeUsernameProblemLanguageResultExecution timeMemory
1266272LmaoLmaoWerewolf (IOI18_werewolf)C++20
0 / 100
122 ms45892 KiB
#include "werewolf.h" #include<bits/stdc++.h> #define fi first #define se second //#define int long long using namespace std; using ll = long long; using ii = pair<int, int>; using aa = array<int,3>; const int N = 2e5+5; const int INF = 1e9; const int MOD = 1e9+7; struct KRTTT { int p[N]; int n; int w[N]; vector<int> adj[N]; int get(int u) { if(p[u]==u) return u; return p[u]=get(p[u]); } void unite(int u,int v,int wei) { u=get(u); v=get(v); if(u==v) return; n++; p[u]=p[v]=p[n]=n; w[n]=wei; adj[n].push_back(u); adj[n].push_back(v); return; } int timer=0; int up[N][18]; int eu[N],out[N]; int rev[N]; int d[N]; void dfs(int u) { eu[u]=++timer; rev[timer]=u; for(int i=1;i<18;i++) { up[u][i]=up[up[u][i-1]][i-1]; } for(int v:adj[u]) { //cout << u << ' ' << v << endl; d[v]=d[u]+1; up[v][0]=u; dfs(v); } out[u]=timer; } bool inside(int u,int v) { return (u==0) || (eu[u]<=eu[v] && out[v]<=out[u]); } int lca(int u,int v) { if(u==v)return 0; //cout << up[u][0] << ' ' << v << endl; // cout << up[u][0] << endl; for(int i=__lg(d[u]);i>=0;i--) { if(!inside(up[u][i],v)) { u=up[u][i]; } } //cout << u << endl; return w[up[u][0]]; } int getu(int u) { return rev[u]; } } KRT; struct DSUUU { vector<int> c[N]; set<int> s[N]; int p[N]; void unite(int u,int v) { u=p[u]; v=p[v]; if(u==v) return; if(c[u].size()<c[v].size()) swap(u,v); for(int x:c[v]) { c[u].push_back(x); p[x]=u; } for(int x:s[v]) { s[u].insert(x); } s[v].clear(); c[v].clear(); } bool solve(int l,int r,int st,int t) { st=p[st]; //cout << KRT.w[7] << endl; //for(int x:s[st]) cout << x << ' '; //cout << endl; auto it=s[st].lower_bound(KRT.eu[t]); if(it!=s[st].end()) { //cout << t << ' '; if(KRT.lca(KRT.getu(*it),t)<=r)return 1; } if(it!=s[st].begin()) { --it; if(KRT.lca(KRT.getu(*it),t)<=r)return 1; } return 0; } } DSU; int L[N]; int R[N]; int S[N]; int E[N]; bool cmp(int x,int y) { return L[x]>L[y]; } int qr[N]; aa edge[N]; aa edge1[N]; vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> ST, vector<int> ED, vector<int> LE, vector<int> RI) { int n=N,m=X.size(),q=ST.size(); for(int i=1;i<=m;i++) { int u=X[i-1],v=Y[i-1]; edge[i]={max(u,v),u,v}; edge1[i]={min(u,v),u,v}; } sort(edge+1,edge+1+m); for(int i=0;i<n;i++) { KRT.p[i]=i; } KRT.n=n-1; for(int i=1;i<=m;i++) { KRT.unite(edge[i][1],edge[i][2],edge[i][0]); } KRT.dfs(KRT.n); //cout << 1; for(int i=1;i<=q;i++) { L[i]=LE[i-1]; R[i]=RI[i-1]; S[i]=ST[i-1]; E[i]=ED[i-1]; qr[i]=i; //cout << S[i] << endl; } for(int i=0;i<n;i++) { DSU.p[i]=i; DSU.c[i].push_back(i); DSU.s[i].insert(KRT.eu[i]); } sort(qr+1,qr+q+1,cmp); int j=m; sort(edge1+1,edge1+1+m); vector<int> ans(q,0); //for(int x:ans) cout << x << endl; for(int i=1;i<=q;i++) { while(j>0 && edge1[j][0]>=L[qr[i]]) { DSU.unite(edge1[j][1],edge1[j][2]); //cout << edge1[j][1] << ' ' << edge1[j][2] << endl; j--; } //cout << endl; ans[qr[i]-1]=DSU.solve(L[qr[i]],R[qr[i]],S[qr[i]],E[qr[i]]); //cout << endl; } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...