社区讨论

为什么改成单向边就能AC?求dalao解答

P3459[POI 2007] MEG-Megalopolis参与者 4已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi6t3hu2
此快照首次捕获于
2025/11/20 10:22
3 个月前
此快照最后确认于
2025/11/21 00:00
3 个月前
查看原帖
CPP
#include <stdio.h>
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)
#define ll long long
template<typename T>
void in(T &x) {
	int k=1;
	x=0;
	char c=getchar();
	while (!('0'<=c && c<='9')) {
		if (c=='-')
			k=-1;
		c=getchar();
	}
	while ('0'<=c && c<='9') {
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=k;
}
template<typename T>
void out(T x,bool pd=true) {
	if (pd) {
		if (x<0) {
			putchar('-');
			x*=-1;
		}
		if (x==0) {
			putchar('0');
			return ;
		}
	}
	if (x==0)
		return ;
	out(x/10,false);
	putchar(x%10+'0');
}
template<typename T>
void swap(T &x,T &y){
	T o=x;
	x=y;
	y=o;
}
int n,m,r,mod=1000000007;
int e,beg[250005],nex[250005],to[250005];
int w[250005],wt[250005];
int a[250005<<2],laz[250005<<2];
int son[250005],id[250005],fa[250005];
int cnt;
int dep[250005],siz[250005],top[250005];
int res=0;
void add(int x,int y) {
	to[++e]=y;
	nex[e]=beg[x];
	beg[x]=e;
}
void push_down(int rt,int lenn) {
	laz[rt<<1]+=laz[rt];
	laz[rt<<1|1]+=laz[rt];
	a[rt<<1]+=laz[rt]*(lenn-(lenn>>1));
	a[rt<<1|1]+=laz[rt]*(lenn>>1);
	a[rt<<1]%=mod;
	a[rt<<1|1]%=mod;
	laz[rt]=0;
}
void build(int rt,int l,int r) {
	if(l==r) {
		a[rt]=wt[l];
		if(a[rt]>mod)
			a[rt]%=mod;
		return;
	}
	build(lson);
	build(rson);
	a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
}
void query(int rt,int l,int r,int L,int R) {
	if(L<=l && r<=R) {
		res+=a[rt];
		res%=mod;
		return;
	} else {
		if(laz[rt])
			push_down(rt,len);
		if(L<=mid)
			query(lson,L,R);
		if(R>mid)
			query(rson,L,R);
	}
}
void update(int rt,int l,int r,int L,int R,int k) {
	if(L<=l && r<=R) {
		laz[rt]+=k;
		a[rt]+=k*len;
	} else {
		if(laz[rt])
			push_down(rt,len);
		if(L<=mid)
			update(lson,L,R,k);
		if(R>mid)
			update(rson,L,R,k);
		a[rt]=(a[rt<<1]+a[rt<<1|1])%mod;
	}
}
void update_range(int x,int y,int k) {
	k%=mod;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		update(1,1,n,id[top[x]],id[x],k);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])
		swap(x,y);
	update(1,1,n,id[x],id[y],k);
}
int ask_range(int x,int y) {
	int ans=0;
	while(top[x]!=top[y]) {
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		res=0;
		query(1,1,n,id[top[x]],id[x]);
		ans+=res;
		ans%=mod;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])
		swap(x,y);
	res=0;
	query(1,1,n,id[x],id[y]);
	ans+=res;
	return ans%mod;
}/*
void update_son(int x,int k) {
	update(1,1,n,id[x],id[x]+siz[x]-1,k);
}
int ask_son(int x) {
	res=0;
	query(1,1,n,id[x],id[x]+siz[x]-1);
	return res;
}*/
void dfs1(int x,int f,int deep) {
	dep[x]=deep;
	fa[x]=f;
	siz[x]=1;
	int maxson=-1;
	for(int i=beg[x]; i; i=nex[i]) {
		int y=to[i];
		if(y==f)
			continue;
		dfs1(y,x,deep+1);
		siz[x]+=siz[y];
		if(siz[y]>maxson){
			son[x]=y;
			maxson=siz[y];
		}
	}
}
void dfs2(int x,int topf) {
	id[x]=++cnt;
	wt[cnt]=w[x];
	top[x]=topf;
	if(!son[x])
		return;
	dfs2(son[x],topf);
	for(int i=beg[x]; i; i=nex[i]) {
		int y=to[i];
		if(y==fa[x]||y==son[x])
			continue;
		dfs2(y,y);
	}
}
int main() {
//	freopen (".in","r",stdin);
//	freopen (".out","w",stdout);
	in(n);
//	in(r);
	r=1;
//	in(mod);
	for(int i=2; i<=n; ++i)
//		in(w[i]);
		w[i]=1;
	for(int i=1; i<n; ++i) {
		int a,b;
		in(a);
		in(b);
		add(a,b);
//		add(b,a); ???????????????????????????????
	}
	dfs1(r,0,1);
	dfs2(r,r);
	build(1,1,n);
	in(m);
	m=n+m-1;
	while(m--) {
		int k,x,y,z;
//		in(k);
		char o[3];
		scanf ("%s",o);
		if(o[0]=='A') {
			in(x);
			in(y);
//			y=x;
//			in(z);
			z=-1;
			update_range(y,y,z);
		} else if(o[0]=='W') {
//			in(x);
			x=1;
			in(y);
			out(ask_range(x,y));
			puts("");
		} /*else if(k==3) {
			in(x);
			in(y);
			update_son(x,y);
		} else {
			in(x);
			out(ask_son(x));
			puts("");
		}*/
	}
}
https://www.luogu.com.cn/record/248303302
https://www.luogu.com.cn/record/248303486

回复

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

正在加载回复...