1 条题解
-
0huangguangrun LV 6 @ 2024-8-14 21:11:48
#include<iostream> #include<cstdio> #include<cassert> #include<vector> #include<queue> #include<algorithm> using namespace std; const int N=100005,M=1000005; const int MOD=1000000007; int n; int a[N],b[N]; vector<int>G[N]; int son[N]; int fa[N]; void dfs(int u,int father) { fa[u]=father; son[u]=0; for(int v:G[u]) { if(v==father) continue; dfs(v,u); son[u]++; } return; } bool vis[N]; int cnt[M],tot; void add(int v) { if(cnt[v]==0) tot++; cnt[v]++; if(cnt[v]==0) tot--; return; } void del(int v) { if(cnt[v]==0) tot++; cnt[v]--; if(cnt[v]==0) tot--; return; } void solve() { assert(scanf("%d",&n)==1); for(int i=1;i<=n;i++) G[i].clear(); fill(vis+1,vis+n+1,false); assert(1<=n&&n<=1e5); for(int i=1;i<n;i++) { int x,y; assert(scanf("%d%d",&x,&y)==2); assert(1<=x&&x<=n); assert(1<=y&&y<=n); assert(x!=y); G[x].emplace_back(y); G[y].emplace_back(x); } for(int i=1;i<=n;i++) assert(scanf("%d",&a[i])==1); for(int i=1;i<=n;i++) assert(scanf("%d",&b[i])1); static int va[N],vb[N]; for(int i=1;i<=n;i++) va[i]=a[i],vb[i]=b[i]; sort(va+1,va+n+1); sort(vb+1,vb+n+1); for(int i=1;i<=n;i++) if(va[i]!=vb[i]) { printf("No\n"); return; } for(int i=1;i<=n;i++) cnt[a[i]]=cnt[b[i]]=0; dfs(1,0); queue<int>q; for(int i=1;i<=n;i++) if(son[i]0) q.emplace(i); while(!q.empty()) { int u=q.front(); q.pop(); if(vis[u]) continue; tot=0; for(int x=u;;x=fa[x]) { if(x0) { printf("No\n"); return; } if(vis[x]) { printf("No\n"); return; } vis[x]=true; add(a[x]),del(b[x]); if(tot0) { if(fa[x]) { son[fa[x]]--; if(son[fa[x]]==0) q.emplace(fa[x]); } break; } } } printf("Yes\n"); return; } int main() { int T; assert(scanf("%d",&T)==1); while(T--) solve(); return 0; }
为什么错啊?
- 1
信息
- ID
- 2873
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 80
- 已通过
- 0
- 上传者