WA0分
查看原帖
WA0分
243263
夜阑楼主2022/5/19 23:08

那个数组的越界和取模先不用管。。。

#include<bits/stdc++.h>
using namespace std;
struct node{int to,next;};
node bian[10010];int head[10010]; 
int fath[10010],dep[10010],size[10010],son[10010]; 
int top[10010],seg[10010],rev[10010]; 
int n,m,r,p,cnt,a[10010]; 
int tree[10010*4],summ; 
void add(int x,int y){
	cnt++;
	bian[cnt].to=y;
	bian[cnt].next=head[x];
	head[x]=cnt;
}
void dfs1(int r,int x){
	fath[x]=r;
	dep[x]=dep[r]+1;
	size[x]=1;
	for(int k=head[x];k;k=bian[k].next){
		if(bian[k].to!=r){
			dfs1(x,bian[k].to);
			size[x]+=size[bian[k].to];
			if(size[bian[k].to]>size[son[x]])son[x]=bian[k].to;
		}
	}
}
void dfs2(int r,int x){
	if(son[x]){
		seg[son[x]]=++seg[0];
		top[son[x]]=top[x];
		rev[seg[son[x]]]=son[x];
		dfs2(x,son[x]);
	}
	for(int k=head[x];k;k=bian[k].next){
		if(top[bian[k].to]==0){ 
			seg[bian[k].to]=++seg[0];
			top[bian[k].to]=bian[k].to;
			rev[seg[bian[k].to]]=bian[k].to;
			dfs2(x,bian[k].to);
		}
	}
}
void build(int i,int l,int r){
	if(l==r){
		tree[i]=a[rev[l]]; 
		return ; 
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i]=tree[i*2]+tree[i*2+1];
}
void query(int k,int l,int r,int x,int y){
	if(x>r||y<l)return ;
	if(x<=l&&y>=r){ 
		summ+=tree[k];
		return ; 
	} 
	int mid=(l+r)/2;
	if(mid>=x)query(k*2,l,mid,x,y);
	if(mid+1<=y)query(k*2+1,mid+1,r,x,y);
}
 
void change(int k,int l,int r,int x,int y,int v){
	if(x>r||y<l)return ;
	if(x<=l&&y>=r){
		tree[k]+=v*(r-l+1);
		return ;
	} 
	int mid=(l+r)/2;
	if(mid>=x)query(k*2,l,mid,x,y);
	if(mid+1<=y)query(k*2+1,mid+1,r,x,y);
}

void ask(int x,int y){
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]<dep[fy])swap(fx,fy),swap(x,y);
		query(1,1,seg[0],seg[x],seg[fx]);
		x=fath[fx],fx=top[x];
	} 
	if(dep[x]>dep[y])swap(x,y);
	query(1,1,seg[0],seg[x],seg[y]);
} 
void changetop(int x,int y,int z){ 
	int fx=top[x],fy=top[y];
	while(fx!=fy){
		if(dep[fx]<dep[fy])swap(fx,fy),swap(x,y); 
		change(1,1,seg[0],seg[x],seg[fx],z);
		x=fath[fx],fx=top[x]; 
	} 
	if(dep[x]>dep[y])swap(x,y);
	change(1,1,seg[0],seg[x],seg[y],z);
} 

void changetree(int x,int z){
	change(1,1,seg[0],seg[x],seg[x]+size[x]-1,z);
}
void asktree(int x){
	query(1,1,seg[0],seg[x],seg[x]+size[x]-1);
}

int main(){
	cin>>n>>m>>r>>p;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);add(y,x);
	}
	dfs1(0,r);
	dfs2(0,r);
	for(int i=1;i<=m;i++){
		int flag,x,y,z;
		cin>>flag;
		if(flag==1){
			cin>>x>>y>>z;
			changetop(x,y,z); 
		}
		else if(flag==2){
			cin>>x>>y;summ=0;
			ask(x,y);
			cout<<summ<<endl;
		}
		else if(flag==3){
			cin>>x>>z;
			changetree(x,z); 
		}
		else if(flag==4){
			cin>>x;summ=0;
			asktree(x);
			cout<<summ<<endl;
		}
	}
	return 0;
}
2022/5/19 23:08
加载中...