提交时间:2024-08-28 15:41:28

运行 ID: 31957

#include<bits/stdc++.h> using namespace std; #define int long long #define lson pos<<1 #define rson pos<<1|1 #define pii pair<int,int> #define fr first #define sc second #define inx int I=h[u],v=edge[I].v;I;I=edge[I].nx,v=edge[I].v int read(){int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}x=c-'0';c=getchar();while(c<='9'&&c>='0'){x*=10;x+=c-'0';c=getchar();}return x*f;} const int MAXN=500010,Mod=998244353,inf=1000000000; int Pow(int x,int y){int rt=1;while(y){if(y&1)rt=rt*x%Mod;x=x*x%Mod;y>>=1;}return rt;} int n,q,a[MAXN],dep[MAXN],p[MAXN],g[MAXN],f[MAXN]; struct Edge{int v,nx;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;}void init(){for(int i=1;i<=n;i++)h[i]=0;CNT=1;} set<pii>st; void dfs(int u,int lst){ f[u]=a[u]; int tmp=0; for(inx)if(v!=lst){ tmp++; dfs(v,u); f[u]=max(f[v],f[u]); } p[a[u]]++; p[f[u]]--; g[f[u]]-=tmp; g[f[u]]++; } void slv(){ n=read(),q=read();q=1; for(int i=1;i<n;i++){ int u=read(),v=read(); st.insert({u,v}); } for(int i=1;i<=n;i++)a[read()]=i; while(q--){ int u1=read(),v1=read(),u2=read(),v2=read(); st.erase({u1,v1});st.erase({v1,u1});st.insert({u2,v2});init(); for(auto o:st){ add_side(o.fr,o.sc); } dfs(1,1); for(int i=1;i<=n;i++)p[i]+=p[i-1],g[i]+=g[i-1]; int ans=0; for(int i=1;i<=n;i++)ans+=(p[i]==0)*g[i],p[i]=g[i]=0; printf("%lld\n",ans); } } signed main(){ freopen("bird.in","r",stdin);freopen("bird.out","w",stdout); slv(); fclose(stdin);fclose(stdout); return 0; }