Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51551 | heaksicn | 树上博弈 | C++ | 运行出错 | 0 | 0 MS | 92 KB | 1714 | 2022-07-13 11:52:11 |
#include<bits/stdc++.h> #define ll long long using namespace std; inline int read(){ int X=0,w=0; char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); } struct edge{ int to,nxt,w; }e[200001]; int head[100001],cnt; void add(int u,int v,int w){ cnt++; e[cnt].to=v; e[cnt].nxt=head[u]; e[cnt].w=w; head[u]=cnt; } bitset <100001> sg[100001],a,bb; int n,q; int b[100001]; int dis[100001],fa[100001]; int dep[100001]; int f[100001][21]; void dfs(int x,int faa){ fa[x]=faa; dep[x]=dep[faa]+1; for(int i=head[x];i;i=e[i].nxt){ int v=e[i].to; if(v==faa) continue; dis[v]=dis[x]+e[i].w; sg[v]=sg[x]; sg[v][e[i].w]=sg[x][e[i].w]^1; dfs(v,x); } for(int i=1;(1<<i)<=dep[x];i++){ f[x][i]=f[f[x][i-1]][i-1]; } }/* int lca(int x,int y){ if(dep[x]>dep[y]) swap(x,y); for(int i=0;i<=18;i++){ f[x][i]= } }*/ int rr; bool check(int x){ bb=a>>(rr+1); int cnt=bb.count(); bb=a>>1; return bb.count()==cnt; } int main(){ n=read(); bool flag=1; for(int i=1;i<n;i++){ int u=read(),v=read(),w=read(); add(u,v,w); add(v,u,w); b[w]++; if(b[w]>=2) flag=0; } dfs(1,0); for(int i=1;i<=n;i++) f[i][0]=fa[i]; q=read(); while(q--){ int u=read(),v=read(); int r=read(); a=sg[u]^sg[v]; if(flag==1||u==v){ printf("0\n"); continue; } int l=0; rr=r; int ans=r+1; while(l<=rr){ int mid=(l+rr)/2; if(check(mid)) l=mid+1,ans=mid; else rr=mid-1; } write(ans); puts(""); } }