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;
}