社区讨论

一直re,求大佬帮忙

P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6w9qku
此快照首次捕获于
2025/11/20 11:51
4 个月前
此快照最后确认于
2025/11/20 11:51
4 个月前
查看原帖
为什么一直re????
CPP
#include<bits/stdc++.h>
using namespace std;
const long long maxn=3e5+10;
long long read()
{
	long long ans=0;bool f=0;char ch=getchar();
	while(ch<'0' or ch>'9'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0' and ch<='9'){ans=(ans<<1)+(ans<<3)+(ch^48);ch=getchar();}
	return f?~ans+1:ans;
}
struct sd{
	long long l,r,ls,rs,data,f;
}tr[maxn<<1];
vector<long long>g[maxn];
long long t,size[maxn],dep[maxn],fa[maxn],top[maxn],pos[maxn],sz,ask[maxn],n,u,v;
long long nw(long long l,long long r)
{
	tr[++t]=(sd){l,r,0,0,0,0};
	return t;
}
void xf(long long o)
{
	if(tr[o].f!=0)
	{
		tr[o].data+=(tr[o].r-tr[o].l+1)*tr[o].f;
		int mid=tr[o].l+tr[o].r>>1;
		tr[tr[o].ls?tr[o].ls:tr[o].ls=nw(tr[o].l,mid)].f+=tr[o].f;
		tr[tr[o].rs?tr[o].rs:tr[o].rs=nw(mid+1,tr[o].r)].f+=tr[o].f;
		tr[o].f=0;
	}
}
void xg(long long o,long long l,long long r,long long c)
{
	xf(o);
	if(tr[o].l==l and tr[o].r==r)
	{
		tr[o].f+=c;
		return;
	}
	long long mid=tr[o].l+tr[o].r>>1;
	if(r<=mid)
	xg(tr[o].ls?tr[o].ls:tr[o].ls=nw(tr[o].l,mid),l,r,c);
	else
	if(l>mid)
	xg(tr[o].rs?tr[o].rs:tr[o].rs=nw(mid+1,tr[o].r),l,r,c);
	else
	xg(tr[o].ls?tr[o].ls:tr[o].ls=nw(tr[o].l,mid),l,mid,c),
	xg(tr[o].rs?tr[o].rs:tr[o].rs=nw(mid+1,tr[o].r),mid+1,r,c);
	xf(tr[o].ls),xf(tr[o].rs);
	tr[o].data=tr[tr[o].ls].data+tr[tr[o].rs].data;
}
long long cx(long long o,long long l,long long r)
{
	if(o==0)
	return 0;
	xf(o);
	if(tr[o].l==l and tr[o].r==r)
	{
		return tr[o].data;
	}
	long long mid=tr[o].l+tr[o].r>>1;
	if(r<=mid)
	return cx(tr[o].ls,l,r);
	else
	if(l>mid)
	return cx(tr[o].rs,l,r);
	else
	return cx(tr[o].ls,l,mid)+cx(tr[o].rs,mid+1,r);
}
long long dfs1(long long now)
{
	size[now]=1;
	for(register int i=0;i<g[now].size();++i)
	{
		long long to=g[now][i];
		if(to==fa[now])
		continue;
		dep[to]=dep[now]+1;
		fa[to]=now;
		dfs1(to);
		size[now]+=size[to];
	}
}
void dfs2(long long now,long long grfa)
{
	long long k=0;
	pos[now]=++sz;
	top[now]=grfa;
	for(register int i=0;i<g[now].size();++i)
	{
		long long to=g[now][i];
		if(to==fa[now] or size[to]<=size[k])
		continue;
		k=to;
	}
	if(k==0)
	return;
	dfs2(k,grfa);
	for(register int i=0;i<g[now].size();++i)
	{
		long long to=g[now][i];
		if(to==fa[now] or to==k)
		continue;
		dfs2(to,to);
	}
}
void dianchang(long long x,long long y)
{
	xg(1,pos[x],pos[x],-1);
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
		swap(x,y);
		xg(1,pos[top[x]],pos[x],1);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])
	swap(x,y);
	xg(1,pos[y],pos[x],1);
	/*for(long long i=1;i<=n;++i)
		printf("%lld ",cx(1,pos[i],pos[i]));
	puts("");*/
}
int main()
{
	//freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	n=read();
	nw(1,n+1);
	tr[0]=(sd){0,0,0,0,0,0};
	for(register int i=1;i<=n;++i)
	ask[i]=read();
	for(register int i=1;i<n;++i)
	{
		u=read(),v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs1(1);
	dfs2(1,1);
	for(register int i=1;i<n;++i)
	dianchang(ask[i],ask[i+1]);
	for(register int i=1;i<=n;++i)
		printf("%lld\n",cx(1,pos[i],pos[i])+(i==ask[1])-(i==ask[n]));
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...