求助传智杯初赛G题
  • 板块学术版
  • 楼主mrozhx
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/12/22 13:41
  • 上次更新2023/11/5 05:48:56
查看原帖
求助传智杯初赛G题
150611
mrozhx楼主2020/12/22 13:41

那几个点是数据比较大,我开了long long,如果是算法太耗时应该是TLE,但我WA了是什么鬼

50分,WA#4,5,8,9,10

#include<bits/stdc++.h>
using namespace std;
long long n,m,val[100100];
int head[100100],to[200100],next[200100],tot=0;
int c[100100],d[100100];
int fa[100100];
int ans=0;
void add(int x,int y){
	to[++tot]=y;
	next[tot]=head[x];
	head[x]=tot;
}
int inti(int now){
	for(int i=head[now];i;i=next[i]){
		int nxt=to[i];
		if(fa[now]!=nxt){
			fa[nxt]=now;
			val[now]+=inti(nxt);
		}
	}
	return val[now];
}
int find(int now){
	return fa[now]==now?now:find(fa[now]);
}
void dfs(int now){
	ans+=val[now];
	for(int i=head[now];i;i=next[i]){
		int nxt=to[i];
		if(fa[nxt]==now) dfs(nxt);
	}
}
void update(int now,int num){
	val[now]-=num;
	if(fa[now]==now) return;
	update(fa[now],num);
}
int main(){
	int opt,x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&val[i]);
		fa[i]=i;
	}
	for(int i=1;i<n;i++){
		scanf("%d%d",&c[i],&d[i]);
		add(c[i],d[i]);
		add(d[i],c[i]);
	}
	inti(1);
	while(m--){
		scanf("%d",&opt);
		switch(opt){
			case 1:{
				scanf("%d",&x);
				if(fa[c[x]]==d[x]) fa[c[x]]=c[x],update(d[x],val[c[x]]);
				else fa[d[x]]=d[x],update(c[x],val[d[x]]);
				break;
			}
			case 2:{
				scanf("%d%d",&x,&y);
				int k=val[x];
				for(int i=head[x];i;i=next[i]) if(fa[x]!=to[i]) k-=val[to[i]];
				update(x,k-y);
				break;
			}
			case 3:{
				scanf("%d",&x);
				printf("%d\n",val[find(x)]);
				break;
			}
		}
	}
}
2020/12/22 13:41
加载中...