先贴代码
#include<bits/stdc++.h>
using namespace std;
#define N 400040
int n, m, u, v, cnt, tot, x, k;
int head[N], a[N], siz[N], dep[N], top[N], fa[N], son[N], id[N], dfs[N], en[N];
int f[N][2];
struct rec {
int next, ver;
} edge[N];
struct Matrix {
int mat[2][2];
Matrix() {
memset(mat, -0x3F, sizeof(mat));
}
inline Matrix operator * (Matrix b) {
Matrix c;
for (int i = 0; i <= 1; i++)
for (int j = 0; j <= 1; j++)
for (int k = 0; k <= 1; k++)
c.mat[i][j] = max(c.mat[i][j], mat[i][k] + b.mat[k][j]);
return c;
}
};
Matrix val[N];
struct seg {
Matrix m;
} t[N];
inline int read() {
int s = 0, w = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
return s * w;
}
inline void add(int u, int v) {
edge[++cnt].next = head[u], edge[cnt].ver = v;
head[u] = cnt;
}
void dfs1(int u) {
siz[u] = 1;
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].ver;
if (v != fa[u]) {
fa[v] = u, dep[v] = dep[u] + 1;
dfs1(v);
siz[u] += siz[v];
if (siz[v] > siz[son[u]]) son[u] = v;
}
}
}
void dfs2(int u, int tp) {
id[u] = ++tot, dfs[tot] = u;
top[u] = tp;
en[tp] = max(en[tp], tot);
f[u][0] = 0, f[u][1] = a[u];
val[u].mat[0][0] = val[u].mat[0][1] = 0, val[u].mat[1][0] = a[u];
if (son[u]) {
dfs2(son[u], tp);
f[u][0] += max(f[son[u]][0], f[son[u]][1]);
f[u][1] += f[son[u]][0];
}
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].ver;
if (v != fa[u] && v != son[u]) {
dfs2(v, v);
f[u][0] += max(f[v][0], f[v][1]);
f[u][1] += f[v][0];
val[u].mat[0][0] = val[u].mat[0][1] += max(f[v][0], f[v][1]);
val[u].mat[1][0] += f[v][0];
}
}
}
void pushup(int p) {
t[p].m = t[p << 1].m * t[p << 1 | 1].m;
}
void build(int p, int l, int r) {
if (l == r) {
t[p].m = val[dfs[l]];
return;
}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
pushup(p);
}
void modify(int p, int l, int r, int x) {
if (l == r) {
t[p].m = val[dfs[l]];
return;
}
int mid = (l + r) >> 1;
if (x <= mid) modify(p << 1, l, mid, x);
if (mid < x) modify(p << 1 | 1, mid + 1, r, x);
pushup(p);
}
Matrix query(int p, int l, int r, int x, int y) {
if (x <= l && r <= y) return t[p].m;
int mid = (l + r) >> 1;
if (x <= mid && mid < y) return query(p << 1, l, mid, x, y) * query(p << 1 | 1, mid + 1, r, x, y);
if (x <= mid) return query(p << 1, l, mid, x, y);
if (mid < y) return query(p << 1 | 1, mid + 1, r, x, y);
}
void calc(int x, int k) {
val[x].mat[1][0] += k - a[x];
a[x] = k;
Matrix be, af;
while (x) {
be = query(1, 1, n, id[top[x]], en[top[x]]);
modify(1, 1, n, id[x]);
af = query(1, 1, n, id[top[x]], en[top[x]]);
x = fa[top[x]];
val[x].mat[0][0] = val[x].mat[0][1] += max(af.mat[0][0], af.mat[1][0]) - max(be.mat[0][0], be.mat[1][0]);
val[x].mat[1][0] += af.mat[0][0] - be.mat[0][0];
}
}
int main() {
n = read(), m = read();
for (int i = 1; i <= n; i++)
a[i] = read();
for (int i = 1; i < n; i++) {
u = read(), v = read();
add(u, v), add(v, u);
}
dfs1(1);
dfs2(1, 1);
build(1, 1, n);
for (int i = 1; i <= m; i++) {
x = read(), k = read();
calc(x, k);
Matrix ans = query(1, 1, n, id[1], en[1]);
printf("%d\n", max(ans.mat[0][0], ans.mat[1][0]));
}
return 0;
}
这样的代码本机编译错误,显示query函数没有返回值,但是luogu评测机却跑过了,好奇是因为结构体作为函数返回值的时候出了问题吗