Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51530 UhhhQQQU 树上博弈 C++ 运行超时 40 1000 MS 13856 KB 1287 2022-07-13 11:50:53

Tests(8/20):


#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 // { // // } }


测评信息: