社区讨论

为什么蒟蒻的树上差分总是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 条回复,欢迎继续交流。

正在加载回复...