Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
51578 xhx_the_juruo 树上博弈 C++ 运行超时 55 1000 MS 16692 KB 1880 2022-07-13 11:53:42

Tests(11/20):


#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int n,m,b; int tot,to[200005],nxt[200005],lst[100005],va[200005]; int cnt,L[100005],R[100005],a[200005],v[100005]; int c[100005],now[100005],ans[100005],nl,nr; struct queries{ int l,r,rr,id,n; }p[100005]; bool cmp(queries x,queries y){ if(x.n!=y.n) return x.n<y.n; if(x.n&1) return x.r<y.r; else return x.r>y.r; } void add(int x,int y,int z){ to[++tot]=y; nxt[tot]=lst[x]; lst[x]=tot; va[tot]=z; return; } void dfs(int x,int fa){ L[x]=++cnt; a[cnt]=x; int y; for(int i=lst[x];i;i=nxt[i]){ if((y=to[i])==fa) continue; v[y]=va[i]; dfs(y,x); } R[x]=++cnt; a[cnt]=x; return; } inline int lowbit(int x){ return x&(-x); } inline void update(int x,int y){ if(!x) return; for(;x<=n;x+=lowbit(x)) c[x]+=y; return; } inline int sum(int x){ int res=0; for(;x;x-=lowbit(x)) res+=c[x]; return res; } inline void ins(int x){ if(now[v[a[x]]]) update(v[a[x]],-1); else update(v[a[x]],1); return now[v[a[x]]]^=1,void(); } int find(int R){ int s=sum(R); int l=0,r=R,mid; while(l<r){ mid=l+r>>1; if(sum(mid)==s) r=mid; else l=mid+1; } return l; } int main(){ int x,y,z; scanf("%d",&n); for(int i=1;i<n;i+=1){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(1,0); scanf("%d",&m); b=max(1,n/(max(1,(int)sqrt(m)))*5/4); for(int i=1;i<=m;i+=1){ scanf("%d%d%d",&x,&y,&z); if(L[x]>L[y]) swap(x,y); p[i].l=L[x]+1; p[i].r=L[y]; p[i].rr=z; p[i].id=i; p[i].n=p[i].l/b+1; } sort(p+1,p+m+1,cmp); nl=1; nr=0; for(int i=1;i<=m;i+=1){ while(nr<p[i].r) ins(++nr); while(nr>p[i].r) ins(nr--); while(nl>p[i].l) ins(--nl); while(nl<p[i].l) ins(nl++); ans[p[i].id]=p[i].rr-find(p[i].rr); } for(int i=1;i<=m;i+=1) printf("%d\n",ans[i]); return 0; }


测评信息: