社区讨论
为什么蒟蒻的树上差分总是RE#4?!!
P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6wj49x
- 此快照首次捕获于
- 2025/11/20 11:58 4 个月前
- 此快照最后确认于
- 2025/11/20 11:58 4 个月前
rt,怎么提交都是RE#4,数据过大还不让下,心态血崩QAQ
CPP#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxn 600010
#define re register
#define FOR(i,l,r) for(re int i=l;i<=r;i++)
using namespace std;
int a[maxn],tag[maxn],ans[maxn],b[maxn],lc[maxn];
int fa[maxn],depth[maxn],siz[maxn],son[maxn],head[maxn<<1],top[maxn];
int c,t,n,m,q,num,tot,x,y;
struct hz{
int next;
int to;
}h[maxn<<1];
inline void in(int &x){
x=0;int f=1;char c=getchar();
while(c<'0'||c>'9'){
if(c==-1) return;
if(c=='-')f=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
x=x*f;
}
inline void out(int a){
if(a<0){
a*=-1;
putchar('-');
}
if(a>=10)out(a/10);
putchar(a%10+'0');
}
void add(int from,int to){
h[++num].next=head[from];
h[num].to=to;
head[from]=num;
}
void dfs1(int f,int ff){
fa[f]=ff;
depth[f]=depth[ff]+1;
siz[f]=1;
int maxson=-1;
for(re int i=head[f];i!=0;i=h[i].next){
if(h[i].to==ff)
continue;
dfs1(h[i].to,f);
siz[f]+=siz[h[i].to];
if(siz[h[i].to]>maxson){
maxson=siz[h[i].to];
son[f]=h[i].to;
}
}
}
void dfs2(int x,int topf){
top[x]=topf;
if(!son[x])
return;
dfs2(son[x],topf);
for(re int i=head[x];i!=0;i=h[i].next){
if(h[i].to==fa[x]||h[i].to==son[x])
continue;
dfs2(h[i].to,h[i].to);
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(depth[top[x]]<depth[top[y]])
swap(x,y);
x=fa[top[x]];
}
if(depth[x]>depth[y])
swap(x,y);
return x;
}
void dfs3(int f,int ff){
ans[f]=tag[f];
for(re int i=head[f];i!=0;i=h[i].next){
if(h[i].to==ff)
continue;
dfs3(h[i].to,f);
ans[f]+=ans[h[i].to];
}
}
int main(){
in(n);
FOR(i,1,n)
in(a[i]);
FOR(i,1,n-1){
in(x),in(y);
add(x,y);
add(y,x);
}
dfs1(1,0);
dfs2(1,1);
FOR(i,1,n-1){
lc[i]=lca(a[i],a[i+1]);
++tag[a[i]],++tag[fa[a[i+1]]],--tag[lc[i]],--tag[fa[lc[i]]];
}
dfs3(1,0);
FOR(i,1,n)
out(ans[i]),puts("");
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...