关于WA的提示信息
查看原帖
关于WA的提示信息
361965
K2Cr2O7楼主2023/11/22 19:34

我所有点 WA 的点提示信息都是 XXX violates the range 然而 expect2004 在讨论区发的 SPJ 代码里根本没有这样的输出。

就挺离谱的,我最小移动数都算对了为什么命令还能是错的。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=200004;
int n,x,y,av,maxd,a[maxn],anc[maxn];
struct item{ int a,b,c;};
vector< int > g[maxn],sd[maxn];
vector< item > cmd;

void dfs(int ver,int fa,int dep){
	anc[ver]=fa;
	maxd=max(maxd,dep);
	sd[dep].push_back(ver);
	for(int i:g[ver])
		if(i!=fa)
			dfs(i,ver,dep+1);
}

signed main(){
//	freopen("P8900_2.in","r",stdin);
//	freopen("8900.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		av+=a[i];
	}
	av/=n;
	for(int i=1;i<=n;i++)
		a[i]-=av;
	for(int i=1;i<n;i++){
		scanf("%lld %lld",&x,&y);
		g[x].push_back(y);
		g[y].push_back(x);
	}
	dfs(1,0,1);
	for(int i=maxd;i;i--)
		for(int j:sd[i]){
			if(a[j]<0){
				a[anc[j]]+=a[j];
				cmd.push_back((item){anc[j],j,-a[j]});
				continue;
			}
			if(a[j]>0){
				a[anc[j]]+=a[j];
				cmd.push_back((item){j,anc[j],a[j]});
			}
		}
	printf("%d\n",cmd.size());
	for(auto i:cmd)
		printf("%lld %lld %lld\n",i.a,i.b,i.c);
	return 0;
}
/*
9
10 7 6 12 21 11 2 14 7
1 2 
2 5
2 3
3 4
3 8
8 9
3 7
1 6
*/
2023/11/22 19:34
加载中...