Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
119115 | 陈家宝 | 树上博弈 | C++ | 通过 | 100 | 615 MS | 15312 KB | 2267 | 2024-01-04 12:56:33 |
#include<cstdio> #include<algorithm> using namespace std; #define rep(a,b,c) for(int c(a);c<=(b);++c) #define drep(a,b,c) for(int c(a);c>=(b);--c) #define grep(b,c) for(int c(head[b]);c;c=nxt[c]) inline int read() { int res=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();return res; } const int N=2e5+10;int head[N],des[N<<1],nxt[N<<1],val[N<<1],cgt,n,L,R; inline void ins(int z,int x,int y) { nxt[++cgt]=head[x];des[head[x]=cgt]=y;val[cgt]=z; nxt[++cgt]=head[y];des[head[y]=cgt]=x;val[cgt]=z; } int top[N],mxs[N],siz[N],dep[N],fa[N],idx[N<<1],dl[N],dr[N],w[N],cdt,qy[N]; inline void dfs0(int u=1,int f=0) { dep[u]=dep[fa[u]=f]+1;int mx=0; grep(u,i)if(des[i]!=f) { int v=des[i];dfs0(v,u);w[v]=val[i]; siz[u]+=siz[v];mx<siz[v]?mx=siz[mxs[u]=v]:0; } } inline void dfs1(int u=1,int fa=0,int tp=1) { idx[dl[u]=++cdt]=u;top[u]=tp;if(mxs[u])dfs1(mxs[u],u,tp); grep(u,i)if(des[i]!=fa&&des[i]!=mxs[u])dfs1(des[i],u,des[i]);idx[dr[u]=++cdt]=u; } const int BK=256;struct NN{int l,r,idx;}t[N]; int ans[N],Q,loc[N],blk,ql[N],qr[N],c[N],cc[N];bool vs[N]; inline void mdy(int u) { if(vs[u]){vs[u]=false;--c[w[u]];} else {vs[u]=true;++c[w[u]];} if(c[w[u]]&1){++cc[loc[w[u]]];} else {--cc[loc[w[u]]];} } inline int Qry(int p) { int B=loc[p];drep(p,ql[B],i)if(c[i]&1)return i; drep(B-1,1,i)if(cc[i]>0){drep(qr[i],ql[i],j)if(c[j]&1)return j;} return 0; } int main() { n=read();rep(2,n,i)ins(read(),read(),read());dfs0();dfs1(); rep(1,n,i)loc[i]=(i-1)/BK+1;blk=loc[n]; rep(1,blk,i)ql[i]=qr[i-1]+1,qr[i]=i*BK;qr[blk]=n; int Q=read();rep(1,Q,i) { int u=read(),v=read();qy[i]=read(); if(u==v){t[i].l=t[i].r=0;ans[i]=0;continue;} if(dl[u]>dl[v])swap(u,v); if(dl[u]<=dl[v]&&dr[v]<=dr[u])t[i]=(NN){dl[u]+1,dl[v],i}; else t[i]=(NN){dr[u],dl[v],i}; } std::sort(t+1,t+Q+1,[&](const NN&x,const NN&y){return x.l/BK==y.l/BK?((x.l/BK)&1?x.r>y.r:x.r<y.r):x.l<y.l;}); L=t[1].l;R=L-1;rep(1,Q,i) { if(!t[i].l&&!t[i].r)continue; while(R<t[i].r)mdy(idx[++R]);while(L>t[i].l)mdy(idx[--L]); while(R>t[i].r)mdy(idx[R--]);while(L<t[i].l)mdy(idx[L++]); ans[t[i].idx]=Qry(qy[t[i].idx]); } rep(1,Q,i){printf("%d\n",qy[i]-ans[i]);} }