社区讨论
一直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 条回复,欢迎继续交流。
正在加载回复...