Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30800 yuanjiabao 【S】T4 C++ 解答错误 0 2992 MS 36972 KB 3277 2024-07-30 15:38:35

Tests(0/10):


#include<iostream> using namespace std; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=200100,B=450,LG=20; int n,m,head[N],to[N<<1],nex[N<<1],wei[N<<1]; int dfn[N],siz[N],dep[N],fa[N][LG]; int a[N]; int bel[N],L[N],R[N]; bool vis[N]; void dfs(int nd,int now){ dfn[nd]=++dfn[0]; a[dfn[nd]]=now; siz[nd]=1; for(int i=head[nd];i;i=nex[i])if(to[i]!=fa[nd][0]){ fa[to[i]][0]=nd; for(int j=1;j<LG;j++)fa[to[i]][j]=fa[fa[to[i]][j-1]][j-1]; dep[to[i]]=dep[nd]+1; dfs(to[i],now+wei[i]); siz[nd]+=siz[to[i]]; } } int cnt[B][N],laz[B]; inline void push_down(int blk){ for(int i=L[blk];i<=R[blk];i++)cnt[blk][a[i]]=0,a[i]+=laz[blk]; laz[blk]=0; } inline void build(int blk){ for(int i=L[blk];i<=R[blk];i++)cnt[blk][a[i]]++; } inline void modify(int l,int r,int k){ if(bel[l]=bel[r]){ push_down(bel[l]); for(int i=l;i<=r;i++)a[i]+=k; build(bel[l]); return; } push_down(bel[l]); push_down(bel[r]); for(int i=l;i<=R[bel[l]];i++)a[i]+=k; for(int i=L[bel[r]];i<=r;i++)a[i]+=k; build(bel[l]); build(bel[r]); for(int i=bel[l]+1;i<bel[r];i++)laz[i]+=k; } inline int count(int l,int r,int k){ int res=0; if(bel[l]=bel[r]){ push_down(bel[l]); for(int i=l;i<=r;i++)if(a[i]==k)res++; build(bel[l]); return res; } push_down(bel[l]); push_down(bel[r]); for(int i=l;i<=R[bel[l]];i++)if(a[i]==k)res++; for(int i=L[bel[r]];i<=r;i++)if(a[i]==k)res++; build(bel[l]); build(bel[r]); for(int i=bel[l]+1;i<bel[r];i++)if(laz[i]<=k)res+=cnt[i][k-laz[i]]; return res; } inline int get_val(int pos){return a[pos]+laz[bel[pos]];} void init(){ cin>>n>>m; for(int i=1;i<n;i++){ int u=read(),v=read(),w=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; wei[i<<1]=wei[i<<1|1]=w; } dfs(1,0); for(int i=1;i<=n;i++){ bel[i]=(i-1)/B+1; if(bel[i]!=bel[i-1])L[bel[i]]=i; if(bel[i]!=i/B+1||i==n)R[bel[i]]=i; } for(int i=1;i<=bel[n];i++)build(i); } inline void modify(int e){ int u=to[e<<1],v=to[e<<1|1],w=wei[e<<1]; int k=((w^1)-w); wei[e<<1]=wei[e<<1|1]=w^1; if(dep[u]<dep[v])swap(u,v); modify(dfn[u],dfn[u]+siz[u]-1,k); } inline int find(int x,int k){ for(int i=LG-1;i>=0;i--)if(fa[x][i]&&get_val(dfn[fa[x][i]])>=k)x=fa[x][i]; return x; } inline int get_ans(int nd){ int v=get_val(dfn[nd]); if(!v)return count(1,n,0)+count(1,n,1); // int A2=find(nd,v-1); // int A1=find(nd,v); // return count(dfn[A2],dfn[A2]+siz[A2]-1,v-1)+count(dfn[A1],dfn[A1]+siz[A1]-1,v)+count(dfn[A1],dfn[A1]+siz[A1]-1,v+1); } int main(){ // freopen("op.in","r",stdin); // freopen("op.out","w",stdout); init(); while(m--){ int op=read(); if(op==1)modify(read()); else printf("%d\n",get_ans(read())); } // cerr<<'t'; return 0; }


测评信息: