Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51794 lzqy_ 树上博弈 C++ 运行出错 0 0 MS 252 KB 4577 2022-07-13 14:42:06

Tests(0/20):


#include<bits/stdc++.h> #define il inline using namespace std; const int maxn=100010; const int maxqn=355; il int read(){ int x=0; char c=getchar(); for(;!(c>='0'&&c<='9');c=getchar()); for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-'0'; return x; } struct Que{ int l,r,x,id; }q[maxn]; struct edge{ int w,v,to; }e[maxn<<1]; int head[maxn],ecnt; void addedge(int u,int v,int w){ e[++ecnt].v=v,e[ecnt].w=w,e[ecnt].to=head[u],head[u]=ecnt; } bool Vis[maxn]; int bl[maxn],L[maxqn],R[maxqn],a[maxn],fl[maxqn]; int dfn[maxn],DFN[maxn],fa[maxn],dep[maxn],top[maxn],zson[maxn],Size[maxn]; int w[maxn],n,m,cnt,idx,qn,N; int ans[maxn],tag[maxn],Tap[maxn]; bool cmp(Que a,Que b){ if(tag[a.l]^tag[b.l]) return tag[a.l]<tag[b.l]; if(tag[a.l]&1) return dfn[a.r]<dfn[b.r]; else return dfn[a.r]>dfn[b.r]; } void dfs1(int fath,int x){ fa[x]=fath,dep[x]=dep[fath]+1; int Max=-1,xx,sum=1; for(int i=head[x];i;i=e[i].to) if(e[i].v^fath){ dfs1(x,e[i].v),xx=Size[e[i].v],sum+=xx; if(xx>Max) Max=xx,zson[x]=e[i].v; } } int dfs2(int x){ int S=0; dfn[x]=++idx,DFN[idx]=x; if(zson[fa[x]]^x) top[x]=x; else top[x]=top[fa[x]]; if(zson[x]) S+=dfs2(zson[x]); for(int i=head[x];i;i=e[i].to) if((e[i].v^fa[x])&&(e[i].v^zson[x])) S+=dfs2(e[i].v); if(S>=qn||x==1) S=0,tag[x]++; return S; } void dfs3(int x,int col){ if(!tag[x])tag[x]=col; else col=tag[x]; for(int i=head[x];i;i=e[i].to) if(e[i].v^fa[x]) dfs3(e[i].v,col); } int lca(int x,int y){ while(top[x]^top[y]) (dfn[top[x]]>dfn[top[y]])?x=fa[top[x]]:y=fa[top[y]]; return (dfn[x]>dfn[y])?y:x; } il void Add(int x){a[x]=1,fl[bl[x]]++;} il void Del(int x){a[x]=0,fl[bl[x]]--;} il int Query(int x){ int Bl=bl[x]; for(int i=x;i>=L[Bl];i--) if(a[i]) return x-i; for(int i=Bl-1;i;i--) if(fl[i]) for(int j=R[i];j>=L[i];j--) if(a[j]) return x-j; return x; } int main(){ freopen("game.in","r",stdin); freopen("game.out","w",stdout); int x,y,z;bool FL=1; n=read(),qn=sqrt(n); for(int i=1;i<=n;i++) bl[i]=(i-1)/qn+1; for(int i=1;i<=bl[n];i++) L[i]=(i-1)*qn+1,R[i]=min(i*qn,n); for(int i=1;i<n;i++){ x=read(),y=read(),z=read(),FL&=(x==i&&y==i+1); addedge(x,y,z),addedge(y,x,z); } if(FL){ for(int i=1;i<=n;i++) for(int j=head[i];j;j=e[j].to) if(e[j].v^(i-1)) w[e[j].v]=e[j].w; for(int i=1;i<=n;i++) tag[i]=bl[i],dfn[i]=i; m=read(); for(int i=1;i<=m;i++){ q[i].l=read(),q[i].r=read(),q[i].x=read(),q[i].id=i; if(q[i].l>q[i].r) swap(q[i].l,q[i].r); q[i].l++; } sort(q+1,q+1+m,cmp); int l=q[1].l,r=q[1].r; for(int i=l;i<=r;i++){ Tap[w[i]]++; if(Tap[w[i]]&1) Add(w[i]); else Del(w[i]); }ans[q[1].id]=Query(q[1].x); for(int i=2;i<=m;i++){ while(l>q[i].l){ l--,Tap[w[l]]++; if(Tap[w[l]]&1) Add(w[l]); else Del(w[l]); } while(r<q[i].r){ r++,Tap[w[r]]++; if(Tap[w[r]]&1) Add(w[r]); else Del(w[r]); } while(l<q[i].l){ Tap[w[l]]--; if(Tap[w[l]]&1) Add(w[l]); else Del(w[l]); l++; } while(r>q[i].r){ Tap[w[r]]--; if(Tap[w[r]]&1) Add(w[r]); else Del(w[r]); r--; }ans[q[i].id]=Query(q[i].x); } for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; } dfs1(0,1),dfs2(1),dfs3(1,0); for(int i=1;i<=n;i++) for(int j=head[i];j;j=e[j].to) if(e[j].v^fa[i]) w[e[j].v]=e[j].w; m=read(); for(int i=1;i<=n;i++) tag[DFN[i]]=(i-1)/qn+1; for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].x=read(),q[i].id=i; sort(q+1,q+1+m,cmp); int l=q[1].l,r=q[1].r,LCA=lca(l,r); for(;l^LCA;l=fa[l]){ Tap[w[l]]++; if(Tap[w[l]]&1) Add(w[l]); else Del(w[l]); }l=q[1].l; for(;r^LCA;r=fa[r]){ Tap[w[r]]++; if(Tap[w[r]]&1) Add(w[r]); else Del(w[r]); }r=q[1].r; ans[q[1].id]=Query(q[1].x); for(int i=2;i<=m;i++){ LCA=lca(l,q[i].l); for(;l^LCA;l=fa[l]){ Vis[l]?Tap[w[l]]++:Tap[w[l]]--; Vis[l]^=1; if(Tap[w[l]]&1) Add(w[l]); else Del(w[l]); }l=q[i].l; for(;l^LCA;l=fa[l]){ Vis[l]?Tap[w[l]]++:Tap[w[l]]--; Vis[l]^=1; if(Tap[w[l]]&1) Add(w[l]); else Del(w[l]); }l=q[i].l; LCA=lca(r,q[i].r); for(;r^LCA;r=fa[r]){ Vis[r]?Tap[w[r]]++:Tap[w[r]]--; Vis[r]^=1; if(Tap[w[r]]&1) Add(w[r]); else Del(w[r]); }r=q[i].r; for(;r^LCA;r=fa[r]){ Vis[r]?Tap[w[r]]++:Tap[w[r]]--; Vis[r]^=1; if(Tap[w[r]]&1) Add(w[r]); else Del(w[r]); }r=q[i].r; ans[q[i].id]=Query(q[i].x); } for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }


测评信息: