Submission #725015

#TimeUsernameProblemLanguageResultExecution timeMemory
725015berrJail (JOI22_jail)C++17
61 / 100
5075 ms43648 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 2e4 + 37; vector<int> adj[N], adj2[N], adj3[N], s(N), e(N), ti(N), to(N), vis(N), de(N), qe(N, -1), qs(N, -1); int par[N][18], cnt, flag; bool ia(int x, int y){ return ti[x] <= ti[y] && to[x] >= to[y]; } int d(int x, int y){ if(x == y || x==-1 || y==-1) return 0; int sum = 0; if(ia(x, y)) swap(x, y); for (int i = 17; i >= 0; i--){ if(!ia(par[x][i], y)){ x = par[x][i]; sum += 1<<i; } } sum++; x=par[x][0]; swap(x, y); sum+=de[x]-de[y]; return sum; } bool c(int x, int y){ if(x==y || x==-1 || y==-1) return 0; if( (d(s[x], e[x]) == (d(s[x], e[y])+ d(e[y], e[x])))) return 1; swap(x, y); return (d(s[x], e[x]) == (d(s[x], s[y])+ d(s[y], e[x]))); } bool c2(int x, int y){ if(x==y) return 0; if(d(s[x], e[x]) == d(s[x], s[y])+ d(s[y], e[y]) + d(e[y], e[x])) return 1; if(d(s[x], e[x]) == d(s[x], e[y])+ d(e[y], s[y]) + d(s[y], e[x])) return 1; return 0; } void dfs(int v, int p){ par[v][0] = p; de[v]=de[p]+1; ti[v] = cnt++; for (auto i: adj[v]){ if (i == p) continue; dfs(i, v); } to[v] = cnt++; } void dfs2(int v, int z){ vis[v] = z; for (auto i: adj2[v]){ if (vis[i]==z) flag = 0; else if(vis[i]<z) dfs2(i, z); } vis[v]=z+1; } void ssolve(int n, int m){ for(int i=0;i<m; i++){ int x=s[i], y=e[i]; while(!ia(x, y)){ int l=qs[x]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; l=qe[x]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; x=par[x][0]; } int l=qs[x]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; l=qe[x]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; while(!ia(y, x)){ int l=qs[y]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; l=qe[y]; if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; y=par[y][0]; } } for(int i = 0; i < n; i++){ if(vis[i]==0) dfs2(i, n*i+1); } if(flag) cout<<"Yes\n"; else cout<<"No\n"; for (int i = 0; i < n; i++){ adj[i].clear(); adj2[i].clear(); vis[i] = 0; qs[i]=qe[i]=-1; } } void solve(){ int n; cin >> n; cnt = 0; for (int i = 1; i < n; i++){ int x, y; cin >> x >> y; x--; y--; adj[x].push_back(y); adj[y].push_back(x); } de[0]=-1; dfs(0, 0); for (int i = 1; i < 18; i++){ for(int l = 0; l < n; l++){ par[l][i] = par[par[l][i-1]][i-1]; } } flag = 1; int m; cin >> m; for (int i = 0; i < m; i++){ cin >> s[i] >> e[i]; s[i]--; e[i]--; qs[s[i]]=i; qe[e[i]]=i; } if(m>500){ ssolve(n, m); return ; } else{ for (int i = 0; i < m; i++){ for (int l = 0; l < m; l++){ if (c(i, l)) adj2[i].push_back(l); if(c2(i, l)) flag = 0; } } for(int i = 0; i < n; i++){ if(vis[i]==0) dfs2(i, n*i+1); } if(flag) cout << "Yes\n"; else cout << "No\n"; for (int i = 0; i < n; i++){ adj[i].clear(); adj2[i].clear(); vis[i] = 0; qs[i]=qe[i]=-1; } } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--){ solve(); } }
#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...