Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30765 A21μΘ_wjy 【S】T4 C++ 运行超时 0 2000 MS 54596 KB 2280 2024-07-30 14:05:09

Tests(0/10):


#include<bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+7; int n,m; vector<int> E[maxn]; struct edge{ int v,w; }; vector<edge> R[maxn]; struct edge1{ int u,v,w; }ed[maxn]; int fa[maxn]; int df[maxn]; int dr[maxn]; int dfn[maxn]; int cnt; int idx[maxn]; int siz[maxn]; int hs[maxn]; int ft[maxn]; void dfs1(int u,int f){ fa[u]=f; df[u]=df[f]+1; siz[u]=1; hs[u]=0; int mx=0; for(auto v:E[u]){ if(v==f)continue; dfs1(v,u); if(siz[v]>mx)hs[u]=v,mx=siz[v]; siz[u]+=siz[v]; } } void dfsr(int u){ for(auto e:R[u]){ int v=e.v,w=e.w; if(v==fa[u])continue; dr[v]=dr[u]+w; dfsr(v); } } void dfs2(int u,int fp){ dfn[u]=++cnt; idx[cnt]=u; ft[u]=fp; if(!hs[u])return; dfs2(hs[u],fp); for(auto v:E[u]){ if(v==fa[u]||v==hs[u])continue; dfs2(v,v); } } int LCA(int u,int v){ while(ft[u]!=ft[v]){ if(df[ft[u]]>df[ft[v]])u=fa[ft[u]]; else v=fa[ft[v]]; } return (df[u]>df[v]?v:u); } int tdr[maxn]; int tr[maxn]; inline int lb(int x){ return x&(-x); } inline void add(int x,int dt){ while(x<=n){ tr[x]+=dt; x+=lb(x); } } inline int qry(int x){ int ans=0; while(x){ ans+=tr[x]; x-=lb(x); } return ans; } int d_real(int x){ return qry(dfn[x]); } int dis_real(int u,int v){ return d_real(u)+d_real(v)-2*d_real(LCA(u,v)); } signed main(){ cin>>n>>m; for(int i=1;i<n;i++){ int u,v,w; cin>>u>>v>>w; ed[i]=(edge1){u,v,w}; E[u].push_back(v),E[v].push_back(u); R[u].push_back((edge){v,w}),R[v].push_back((edge){u,w}); } dfs1(1,0); dfsr(1); dfs2(1,1); for(int i=1;i<=n;i++){ tdr[dfn[i]]=dr[i]; } for(int i=1;i<=n;i++)tr[i]=tdr[i]-tdr[i-lb(i)]; // for(int i=1;i<=n;i++)cout<<d_real(i)<<" "; while(m--){ int op,k; cin>>op>>k; if(op==1){ int u=ed[k].u,v=ed[k].v,w=ed[k].w; if(fa[u]==v)swap(u,v); if(w)add(dfn[u],-1),add(dfn[u]+siz[u],1); else add(dfn[u],1),add(dfn[u]+siz[u],-1); ed[k].w=1-ed[k].w; // for(int i=1;i<=n;i++)cout<<d_real(i)<<" "; // cout<<endl; } else if(op==2){ int cnt=0; for(int i=1;i<=n;i++)if(dis_real(i,k)<=1)cnt++; cout<<cnt<<endl; } } } /* 6 4 1 2 1 2 3 0 3 4 0 3 5 0 1 6 0 2 3 1 2 2 3 2 2 */


测评信息: