Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
51530 | UhhhQQQU | 树上博弈 | C++ | 运行超时 | 40 | 1000 MS | 13856 KB | 1287 | 2022-07-13 11:50:53 |
#include<cstdio> #include<algorithm> using namespace std; const int N=1e5+10; int n,m; struct edge{ int nxt,go,val; }e[N*2]; int head[N],cnt; void add(int u,int v,int w){e[++cnt]=(edge){head[u],v,w},head[u]=cnt;} int dep[N],fa[N],ff[N]; int rt; struct query{ int u,v,r; }q[N]; int num[N]; void dfs(int u,int f) { fa[u]=f; dep[u]=dep[f]+1; for(int i=head[u];i;i=e[i].nxt) { int v=e[i].go; if(v!=f) dfs(v,u),ff[v]=e[i].val; } } void solve(int u,int v,int r) { if(dep[u]<dep[v]) swap(u,v); while(dep[v]!=dep[u]) { ++num[ff[u]]; u=fa[u]; } while(u!=v) ++num[ff[u]],++num[ff[v]],u=fa[u],v=fa[v]; int zt=0,ans=0,ff=0; for(int i=r;i>=1;i--) { if(num[i]&1) break; else if(num&&(!(num[i]&1))) ++ans,ff=1; else if(!num&&!ff) ++ans; } printf("%d\n",ans); } int main() { scanf("%d",&n); rt=1; for(int i=1;i<n;i++) { int u,v,w; scanf("%d %d %d",&u,&v,&w); add(u,v,w),add(v,u,w); } scanf("%d",&m); for(int i=1;i<=m;i++) { int u,v,r; scanf("%d %d %d",&u,&v,&r); q[i]=(query){u,v,r}; } dfs(1,0); // if(n<=2000) // { for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) num[j]=0; solve(q[i].u,q[i].v,q[i].r); } // } // else //ff // { // // } }