Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
67800 wssdr 小 P 的树 C++ 解答错误 0 501 MS 5784 KB 2023 2023-01-19 12:32:17

Tests(0/10):


#include<bits/stdc++.h> #define N 45005 using namespace std; int n,m; struct Edge{ int nxt,to,val; Edge(int a=0,int b=0,int c=0):nxt(a),to(b),val(c){} }; struct Edge e[N<<1]; int head[N],cnt(1); inline void add(int x,int y,int z){ e[++cnt]=Edge(head[x],y,z);head[x]=cnt; e[++cnt]=Edge(head[y],x,z);head[y]=cnt; } int dis[N],TO[N],fa[N]; void dfs(int u,int f){ for(int i(head[u]);i;i=e[i].nxt){ int v(e[i].to); if(v^f){ TO[i]=TO[i^1]=v; dis[v]=dis[u]^e[i].val; fa[v]=u; dfs(v,u); } } } int tot,son[1<<25][2],f[1<<25]; inline void Insert(int w){ int cur(0); for(int i(22);~i;--i){ int x((w>>i)&1); if(!son[cur][x]) son[cur][x]=++tot; cur=son[cur][x]; } f[cur]=w; } inline int Query(int w){ int cur(0),ans; for(int i(22);~i;--i){ int x((w>>i)&1); if(son[cur][x^1]) x^=1; cur=son[cur][x]; if(f[cur]) ans=max(ans,w^f[cur]); } return ans; } int c[25][2]; inline void Addcnt(int w){ for(int i(0);i<=22;++i) ++c[i][(w>>i)&1]; } inline int Qucnt(int w){ int ans(0); for(int i(0);i<=22;++i) ans+=c[i][(w>>i)&1^1]*(1<<i); return ans; } inline void Clear(int cur){ if(son[cur][0]) Clear(son[cur][0]); if(son[cur][1]) Clear(son[cur][1]); son[cur][0]=son[cur][1]=f[cur]=0; } int main(){ // freopen("tree.in","r",stdin); // freopen("tree.out","w",stdout); scanf("%d%d",&n,&m); for(int i(1);i<n;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } dfs(1,0); for(int i(1);i<=n;++i){ Insert(dis[i]); Addcnt(dis[i]); } while(m--){ int op,x,w; scanf("%d",&op); if(op==1){ scanf("%d",&x); printf("%d\n",Query(dis[x])); } else if(op==2){ scanf("%d",&x); printf("%d\n",Qucnt(dis[x])); } else{ scanf("%d%d",&x,&w); x<<=1;dis[TO[x]]^=e[x].val; dis[TO[x]]^=(e[x].val=e[x^1].val=w); dfs(TO[x],fa[TO[x]]); tot=0;Clear(0);memset(c,0,sizeof(c)); for(int i(1);i<=n;++i){ Insert(dis[i]); Addcnt(dis[i]); } } } return 0; }


测评信息: