本机编译错误,问个语法问题
查看原帖
本机编译错误,问个语法问题
31069
Agakiss楼主2023/5/10 17:11

先贴代码

#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评测机却跑过了,好奇是因为结构体作为函数返回值的时候出了问题吗

2023/5/10 17:11
加载中...