Submission #587525

#TimeUsernameProblemLanguageResultExecution timeMemory
587525czhang2718Jail (JOI22_jail)C++17
100 / 100
1832 ms341104 KiB
#include "bits/stdc++.h" using namespace std; #define rep(i,a,b) for(int i=a; i<=b; i++) #define f first #define s second #define pb push_back #define nl '\n' typedef vector<int> vi; typedef pair<int, int> pii; const int N=120001; const int K=17; const int BN=4800001; int t, n, m; bool cyc; vi adj[N]; vi adj2[BN]; bool seen[BN], vis[BN]; int par[N][K]; int he[N]; int id_start[N][K]; int id_end[N][K]; int st[N], nd[N]; int ti; void dfs(int x, int p){ id_start[x][0]=st[x]; id_end[x][0]=nd[x]; rep(i,1,K-1){ par[x][i]=par[par[x][i-1]][i-1]; id_start[x][i]=++ti; id_end[x][i]=++ti; if(id_start[x][i-1]) adj2[id_start[x][i-1]].pb(id_start[x][i]); if(id_start[par[x][i-1]][i-1]) adj2[id_start[par[x][i-1]][i-1]].pb(id_start[x][i]); if(id_end[x][i-1]) adj2[id_end[x][i]].pb(id_end[x][i-1]); if(id_end[par[x][i-1]][i-1]) adj2[id_end[x][i]].pb(id_end[par[x][i-1]][i-1]); } for(int k:adj[x]){ if(k==p) continue; he[k]=he[x]+1; par[k][0]=x; dfs(k, x); } } int lca(int u, int v){ if(he[u]<he[v]) swap(u,v); int d=he[u]-he[v]; for(int i=0; i<K; i++){ if(d&(1<<i)) u=par[u][i]; } if(u==v) return u; for(int i=K-1; i>=0; i--){ if(par[u][i] && par[u][i]!=par[v][i]) u=par[u][i], v=par[v][i]; } return par[u][0]; } int dist(int u, int v){ return he[u]+he[v]-2*he[lca(u,v)]; } void dfs2(int x){ vis[x]=1; seen[x]=1; for(int k:adj2[x]){ if(seen[k]){ cyc=1; return; } if(vis[k]) continue; dfs2(k); } seen[x]=0; } void add_start(int a, int up, int to){ int d=he[a]-he[up]+1; for(int i=K-1; i>=0; i--){ if(d&(1<<i)){ if(id_start[a][i]) adj2[id_start[a][i]].push_back(to); a=par[a][i]; } } } void add_end(int a, int up, int to){ // cout << "add end " << a << " - " << up << " TO " << to << nl; int d=he[a]-he[up]+1; for(int i=K-1; i>=0; i--){ if(d&(1<<i)){ if(id_end[a][i]) adj2[to].push_back(id_end[a][i]); a=par[a][i]; } } } int binlift(int x, int d){ int old=x; rep(i,0,K-1){ if(d&(1<<i)) x=par[x][i]; } return x; } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> t; while(t--){ cin >> n; rep(i,1,n) adj[i].clear(); rep(i,1,n-1){ int u,v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } cin >> m; vector<pii> qu; rep(i,1,m){ int s, e; cin >> s >> e; qu.pb({s, e}); st[s]=i; nd[e]=i; } ti=m; dfs(1, 0); // add edges rep(i,1,m){ int a=qu[i-1].f, b=qu[i-1].s; int lc=lca(a,b); if(a==lc) add_start(b, binlift(b, he[b]-he[a]-1), i); else add_start(par[a][0],lc, i), add_start(b,lc, i); if(b==lc) add_end(a, binlift(a, he[a]-he[b]-1), i); else add_end(par[b][0],lc, i), add_end(a,lc, i); } cyc=0; rep(i,1,ti){ if(cyc) break; if(vis[i]) continue; dfs2(i); } cout << (cyc?"No":"Yes") << nl; rep(i,1,ti){ vis[i]=seen[i]=0; adj2[i].clear(); } rep(i,1,m){ int s=qu[i-1].f, e=qu[i-1].s; st[s]=0; nd[e]=0; } } } //

Compilation message (stderr)

jail.cpp: In function 'int binlift(int, int)':
jail.cpp:99:6: warning: unused variable 'old' [-Wunused-variable]
   99 |  int old=x;
      |      ^~~
#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...