求助,本地输出没问题,但是交上去就错了
查看原帖
求助,本地输出没问题,但是交上去就错了
363036
chlchl楼主2023/8/23 17:04

rt,它显示我 WA on #64,并且说我输出了 -1,数据如下:

input:
4
2 1
4 3
2 4
404509180957 281924078194 551160769548

output:
404509180957
551160769548
1152921235370155622

但是本地亲测是能输出 std 的那个答案的,求调。

#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int MOD = (1ll << 60);
const int N = 1e5 + 10;
int n, f[N][24], dep[N], res[N];
int id, head[N << 1], to[N << 1], nxt[N << 1], num[N << 1];
int d[N], ans[N << 1][64];

void add(int u, int v, int idx){
	to[++id] = v, num[id] = idx;
	nxt[id] = head[u], head[u] = id;
}

void dfs(int u, int p){
	f[u][0] = p;
	for(int i=1;i<=20;i++)
		f[u][i] = f[f[u][i - 1]][i - 1];
	for(int i=head[u];i;i=nxt[i]){
		int v = to[i];
		if(v == p)
			continue;
		dep[v] = dep[u] + 1;
		dfs(v, u);
	}
}

int LCA(int u, int v){
	if(dep[u] < dep[v])
		swap(u, v);
	for(int i=20;i>=0;i--)
		if(dep[f[u][i]] >= dep[v])
			u = f[u][i];
	if(u == v)
		return u;
	for(int i=20;i>=0;i--)
		if(f[u][i] != f[v][i])
			u = f[u][i], v = f[v][i];
	return f[u][0];
}

void build(int u){
	for(int i=head[u];i;i=nxt[i]){
		int v = to[i];
		if(v == f[u][0])
			continue;
		build(v);
		res[num[i]] = ((ans[v][60] - ans[u][60]) % MOD + MOD) % MOD;
	} 
}

main(){
	scanf("%lld", &n);
	for(int i=1,u,v;i<n;i++){
		scanf("%lld%lld", &u, &v);
		add(u, v, i), add(v, u, i);
	}
	dfs(1, 1);
	for(int i=1;i<n;i++)
		scanf("%lld", &d[i]);
	for(int j=1;j<=60;j++){
		int P = (1ll << j);
		for(int i=1;i<n;i++){
			ans[i + 1][j] = (d[i] + 2ll * ans[LCA(i, i + 1)][j - 1] % P - ans[i][j]) % P;
			(ans[i + 1][j] += P) %= P;
//			cout << LCA(i, i + 1) << ',' << ans[i + 1][j] << ' ';
		}
//		cout << endl;
	}
	build(1);
	for(int i=1;i<n;i++)
		if(res[i] <= 0ll || d[i] != ans[i][60] + ans[i + 1][60] - 2ll * ans[LCA(i, i + 1)][60])
			return printf("-1\n"), 0;
	for(int i=1;i<n;i++)
		printf("%lld\n", res[i]); 
	return 0;
}
2023/8/23 17:04
加载中...