Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
30838 | baka24 | 【S】T4 | C++ | 解答错误 | 40 | 976 MS | 73004 KB | 3547 | 2024-07-30 20:27:14 |
#include<bits/stdc++.h> using namespace std; #define int long long #define inx(u) int I=h[(u)],v=edge[I].v,w=edge[I].w;I;I=edge[I].nx,v=edge[I].v,w=edge[I].w const int MAXN=200010,B=500,N=25; int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return x*f;} struct Edge{int v,nx,w,u;}edge[MAXN<<1];int h[MAXN],CNT;void add_side(int u,int v,int w){edge[++CNT]={v,h[u],w,u};h[u]=CNT;edge[++CNT]={u,h[v],w,u};h[v]=CNT;} int n,m,a[MAXN],f[MAXN],fa[MAXN][N],dep[MAXN],dfn[MAXN],ed[MAXN],cnt,bel[MAXN]; void dfs(int u,int lst){ // cout<<u<<" "; dfn[u]=++cnt,fa[u][0]=lst; for(inx(u))if(v!=lst){ f[cnt+1]=f[dfn[u]]+w,dep[v]=dep[u]+1; dfs(v,u); } ed[u]=cnt; } struct node{ int num[MAXN],l,r,tag; void build(){ for(int i=l;i<=r;i++)num[f[i]]++; } void add(int x,int y){ num[f[x]]--; f[x]+=y; num[f[x]]++; } void ad(int x){ tag+=x; } int qy(int x){ return f[x]+tag; } int qry(int x){ return num[x-tag]; } }; struct fenkuai{ node k[B+20]; void build(){ for(int i=bel[1];i<=bel[n];i++){ k[i].l=(i-1)*B+1; k[i].r=i*B; k[i].build(); } } int qry(int l,int r,int x){ int res=0; if(bel[l]!=bel[r]){ for(int i=l;bel[i]==bel[l];i++)res+=k[bel[i]].qy(i)==x; for(int i=r;bel[r]==bel[i];i--)res+=k[bel[i]].qy(i)==x; for(int i=bel[l]+1;i<bel[r];i++)res+=k[i].qry(x); } else{ for(int i=l;i<=r;i++)res+=k[bel[i]].qy(i)==x; } return res; } void upd(int l,int r,int x){ if(bel[l]!=bel[r]){ for(int i=l;bel[i]==bel[l];i++)k[bel[i]].add(i,x); for(int i=r;bel[r]==bel[i];i--)k[bel[i]].add(i,x); for(int i=bel[l]+1;i<bel[r];i++)k[i].ad(x); } else{ for(int i=l;i<=r;i++)k[bel[i]].add(i,x); } } }F; int qf(int x){ return f[x]+F.k[bel[x]].tag; } void slv(){CNT=1; n=read(),m=read(); for(int i=1;i<=n;i++)bel[i]=(i-1)/B+1; for(int i=1;i<n;i++){ int u=read(),v=read(),w=read(); add_side(u,v,w); } dfs(1,1); // cout<<endl; // for(int i=1;i<=n;i++)cout<<dfn[i]<<" ";cout<<endl; for(int i=1;i<=N-5;i++)for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1]; F.build(); // for(int i=1;i<=n;i++)cout<<f[i]<<" ";cout<<endl; while(m--){ int op=read(),k=read(); if(op==1){ int u=edge[k<<1].u,v=edge[k<<1].v; if(dep[u]<dep[v])swap(u,v); if(edge[k<<1].w)F.upd(dfn[u],ed[u],-1); else F.upd(dfn[u],ed[u],1); edge[k<<1].w^=1; } else{ for(int i=N-5;~i;i--)if(qf(dfn[fa[k][i]])==qf(dfn[k]))k=fa[k][i]; int p=fa[k][0]; for(int i=N-5;~i;i--)if(qf(dfn[fa[p][i]])==qf(dfn[p]))p=fa[p][i]; // cout<<k<<" "<<p<<" "<<endl; // cout<<F.qry(dfn[p],ed[p],qf(dfn[p]))<<" "<<F.qry(dfn[k],ed[k],qf(dfn[k]))<<" "<<F.qry(dfn[k],ed[k],qf(dfn[k])+1)<<endl; printf("%lld\n",(p!=k?F.qry(dfn[p],ed[p],qf(dfn[p])):0)+F.qry(dfn[k],ed[k],qf(dfn[k]))+F.qry(dfn[k],ed[k],qf(dfn[k])+1)); } // for(int i=1;i<=n;i++)cout<<f[i]+F.tag[bel[i]]<<" ";cout<<endl; } } signed main(){ slv(); return 0; }