Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51703 wssdr 树上博弈 C++ 运行超时 20 1000 MS 46160 KB 1887 2022-07-13 13:15:52

Tests(4/20):


#include<bits/stdc++.h> #define I using #define LOVE namespace #define monisai std #define N 100005 I LOVE monisai; int n,m; struct Edge{int v,w;}; vector <Edge> s[N]; int ls[N*20],rs[N*20],sum[N*20],Rt[N*20],cnt; int fa[N][30],dep[N],tmp,Max; #define mid (l+r>>1) void Build(int &rt,int l,int r){ rt=++cnt; if(l==r) return; Build(ls[rt],l,mid); Build(rs[rt],mid+1,r); } void Insert(int &rt,int pre,int l,int r,int x){ sum[rt=++cnt]=sum[pre]+1; if(l==r) return; ls[rt]=ls[pre];rs[rt]=rs[pre]; if(x<=mid) Insert(ls[rt],ls[pre],l,mid,x); else Insert(rs[rt],rs[pre],mid+1,r,x); } int Query(int u,int v,int z,int l,int r,int mx){ if(l==r){ int FUCK(sum[u]+sum[v]-(sum[z]<<1));++tmp; // cout<<l<<" "<<sum[u]<<" "<<sum[v]<<" "<<sum[z]<<endl; if(!FUCK) return 0; Max=max(Max,l); int f(tmp);tmp=0; return FUCK&1?0:f; } if(mx<=mid) return Query(ls[u],ls[v],ls[z],l,mid,mx); return Query(ls[u],ls[v],ls[z],l,mid,mx)+Query(rs[u],rs[v],rs[z],mid+1,r,mx); } #undef mid void dfs(int k,int f,int w){ fa[k][0]=f;dep[k]=dep[f]+1; for(int i(1);i<=25;++i) fa[k][i]=fa[fa[k][i-1]][i-1]; if(k^1) Insert(Rt[k],Rt[f],1,n,w); for(int i(0);i<s[k].size();++i) if(s[k][i].v^f) dfs(s[k][i].v,k,s[k][i].w); } inline int LCA(int x,int y){ if(dep[x]<dep[y]) swap(x,y); for(int i(25);i>=0;--i) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i]; if(x==y) return x; for(int i(25);i>=0;--i) if(fa[x][i]^fa[y][i]) x=fa[x][i],y=fa[y][i]; return fa[x][0]; } int main(){ scanf("%d",&n); for(int i(1),u,v,w;i<n;++i){ scanf("%d%d%d",&u,&v,&w); s[u].push_back((Edge){v,w}); s[v].push_back((Edge){u,w}); } Build(Rt[1],1,n);dfs(1,0,0); scanf("%d",&m); while(m--){ int U,V,R,ans;scanf("%d%d%d",&U,&V,&R);tmp=Max=0; ans=Query(Rt[U],Rt[V],Rt[LCA(U,V)],1,n,R); ans+=R-Max; printf("%d\n",ans); } return 0; }


测评信息: