求助,为什么RE
查看原帖
求助,为什么RE
571937
zhouyiran_2011楼主2024/4/6 14:19
#include<bits/stdc++.h>
const int N=700001;
using namespace std;
int ls[N<<2], rs[N<<2], tr[N*30];
int f[N][20], head[N], dep[N], son[N];
int sum[N], s[N], t[N], w[N], ans[N];
int n, m, rt[N], cnt, edgenum;
struct edge{
	int to, next;
}edge[N<<1];
void add_edge(int x,int y) 
{
	edge[++edgenum].to=y;
	edge[edgenum].next=head[x];
	head[x]=edgenum;
}
void dfs(int u, int fa)
{
	dep[u]=dep[fa]+1;
	f[u][0]=fa;
	for(int i=1;i<=18;i++)
	{
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for(int i=head[u];i;i=edge[i].next) 
	{
		int v=edge[i].to;
		if(v==fa)
		{
			continue;
		}
		dfs(v, u);
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])
	{
		swap(x, y);
	}
	for(int i=18;i>=0;i--)
	{
		if(dep[f[x][i]]>=dep[y])
		{
			x=f[x][i];
		}
	} 
	if(x==y)
	{
		return x;
	}
	for(int i=18;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i], y=f[y][i];
		} 
	}
	return f[x][0];
}
void pushup(int id) 
{
	tr[id]=tr[ls[id]]+tr[rs[id]];
}
int add(int a,int x,int y,int p,int val) 
{
    if(!a) a=++cnt;
    if(x==y) 
	{
		tr[a]+=val;
		return a;
	}
    int mid=(x+y)>>1;
    if(p<=mid)
	{
		ls[a]=add(ls[a], x, mid, p, val);
	} 
    else rs[a]=add(rs[a], mid+1, y, p, val);
    pushup(a);
    return a;
}
int merge(int a,int b,int x,int y)
{
	if(!a) return b;
	if(!b) return a;
	if(x==y)
	{
		tr[a]+=tr[b];
		t[a]=x;
		return a;
	}
	int mid=(x+y)>>1;
	ls[a]=merge(ls[a], ls[b], x, mid);
	rs[a]=merge(rs[a], rs[b], mid+1, y);
//	pushup(a);
	return a;
}
int query(int id,int l,int r,int v)
{
	if(!id)	return 0;
	if(l==r)
	{
		return tr[id];
	}
	int mid=(l+r)>>1;
	if(v<=mid) 
	{
		return query(ls[id], l, mid, v);
	}
	else
	{
		return query(rs[id], mid+1, r, v);
	}
}
void dfs3(int u) 
{
    for(int i=head[u];i;i=edge[i].next)
    {
    	int v=edge[i].to;
    	if(v!=f[u][0])
		{
			dfs3(v);
			rt[u]=merge(rt[u],rt[v],1,N<<1);
		} 
	}
    if(w[u]&&n+dep[u]+w[u]<=2*n)
	{
		ans[u]+=query(rt[u], 1, N<<1, n+dep[u]+w[u]);
	} 
	ans[u]+=query(rt[u], 1, N<<1, n+dep[u]-w[u]);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<n;i++) 
	{
		int u, v;
		cin>>u>>v;
		add_edge(u, v);
		add_edge(v, u);
	}
    dep[1]=1;
	dfs(1, 0);
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]; 
	}
    for(int i=1;i<=m;i++) 
	{
		cin>>s[i]>>t[i];
	}
    for(int i=1;i<=m;i++)
    {
        int u=lca(s[i],t[i]);
        rt[s[i]]=add(rt[s[i]], 1, N<<1, n+dep[s[i]], 1);
		rt[t[i]]=add(rt[t[i]], 1, N<<1, n+dep[u]*2-dep[s[i]], 1);
        rt[u]=add(rt[u], 1, N<<1, n+dep[s[i]], -1);
        rt[f[u][0]]=add(rt[f[u][0]], 1, N<<1, n+dep[u]*2-dep[s[i]], -1);
    }
    dfs3(1);
    for(int i=1;i<=n;i++)
	{
		cout<<ans[i]<<" ";
	} 
    return 0;
}
2024/4/6 14:19
加载中...