QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#666245#9492. 树上简单求和GalexCompile Error//C++234.6kb2024-10-22 17:19:062024-10-22 17:19:07

Judging History

This is the latest submission verdict.

  • [2024-10-22 17:19:07]
  • Judged
  • [2024-10-22 17:19:06]
  • Submitted

answer

#include <bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define pii pair<int, int>
#define pll pair<LL, LL>
#define fi first
#define se second
#define mkp make_pair
#define sz(x) (int)x.size()
using namespace std;
bool Mst;

LL read() {
	LL s = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		f = (ch == '-' ? -1 : 1), ch = getchar();
	while (ch >= '0' && ch <= '9')
		s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	return s * f;
}

ULL readull() {
	ULL s = 0; char ch = getchar();
	while (ch < '0' || ch > '9') ch = getchar();
	while (ch >= '0' && ch <= '9') s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
	return s;
}

mt19937 rnd(time(NULL));

const int MAXN = 200005;

int n, m;
ULL a[MAXN];
vector<int> e[MAXN];
int fa[MAXN][20], dep[MAXN];
int dfn[MAXN], tim = 0, rnk[MAXN];

void pre(int x, int fat) {
	fa[x][0] = fat, dep[x] = dep[fat] + 1;
	dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1;
	for (int y : e[x])
		if (y != fat)
			pre(y, x), sz[x] += sz[y];
}

int mov(int u, int d) {
	for (int i = 18; i >= 0; i--)
		if ((1 << i) <= d)
			d -= (1 << i), u = fa[u][i];
	return u;
}

int lca(int u, int v) {
	dep[u] > dep[v] ? u = mov(u, dep[u] - dep[v]) : v = mov(v, dep[v] - dep[u]);
	if (u == v) return u;
	for (int i = 18; i >= 0; i--)
		if (fa[u][i] != fa[v][i])
			u = fa[u][i], v = fa[v][i];
	return fa[u][0];
}

namespace Blocker {
	const int MAXC = 505;
	int B, C;
	int L[MAXC], R[MAXC], bl[MAXN];
	ULL sum[MAXC], val[MAXN];
	void init() {
		B = sqrt(n), C = (n - 1) / B + 1;
		for (int i = 1; i <= n; i++)
			bl[i] = (i - 1) / B + 1, R[bl[i]] = i;
		for (int i = n; i; i--)
			L[bl[i]] = i;
	}
	void mdf(int x, ULL v) {
		sum[bl[x]] += v, val[x] += v;
	}
	ULL qry(int l, int r) {
		if (bl[l] == bl[r]) {
			ULL ans = 0;
			for (int i = l; i <= r; i++) ans += sum[i];
			return ans;
		}
		ULL ans = 0;
		for (int i = l; i <= R[bl[l]]; i++) ans += val[i];
		for (int i = L[bl[r]]; i <= r; i++) ans += val[i];
		for (int i = bl[l] + 1; i < bl[r]; i++) ans += sum[i];
		return ans;
	}
}

namespace Tree1 {
	vector<int> e[MAXN];
	void add(int u, int v) {
		e[u].push_back(v);
		e[v].push_back(u);
	}
	int fa[MAXN][20], dep[MAXN], dfn[MAXN], rnk[MAXN], tim = 0, sz[MAXN];
	void pre(int x, int fat) {
		dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1;
		fa[x][0] = fat, dep[x] = dep[fat] + 1;
		for (int y : e[x])
			if (y != fat)
				pre(y, x), sz[x] += sz[y];
	}
	int mov(int u, int d) {
		for (int i = 18; i >= 0; i--)
			if ((1 << i) <= d)
				d -= (1 << i), u = fa[u][i];
		return u;
	}
	int lca(int u, int v) {
		dep[u] > dep[v] ? u = mov(u, dep[u] - dep[v]) : v = mov(v, dep[v] - dep[u]);
		if (u == v) return u;
		for (int i = 18; i >= 0; i--)
			if (fa[u][i] != fa[v][i])
				u = fa[u][i], v = fa[v][i];
		return fa[u][0];
	}
	void pre() {
		pre(1, 0);
		for (int j = 1; j <= 18; j++)
			for (int i = 1; i <= n; i++)
				fa[i][j] = fa[fa[i][j - 1]][j - 1];
	}
	void mdf(int x, int y, int l, ULL k) {
		Blocker::mdf(dfn[x], k), Blocker::mdf(dfn[y], k);
		Blocker::mdf(dfn[l], -k), Blocker::mdf(fa[dfn[l]][0], -k);
	}
	ULL qry(int x) {
		return Blocker::qry(dfn[x], dfn[x] + sz[x] - 1);
	}
}

int p[MAXN], cnt = 0;
bool in[MAXN];

void spread() {
	cnt = 300;
	for (int i = 1; i <= cnt; i++) p[i] = rnd() % n + 1; p[++cnt] = 1;
	sort(p + 1, p + cnt + 1, [](int x, int y) {return dfn[x] < dfn[y];});
	for (int i = 2, len = cnt; i <= len; i++) p[++cnt] = lca(p[i], p[i - 1]);
	sort(p + 1, p + cnt + 1, [](int x, int y) {return dfn[x] < dfn[y];});
	cnt = unique(p + 1, p + cnt + 1) - p - 1;
	for (int i = 1; i <= cnt; i++) in[p[i]] = 1;
}

int x[MAXN], y[MAXN], l1[MAXN];
int p1[MAXN], p2[MAXN], p3[MAXN];
ULL ans[MAXN], k[MAXN];

int qry(int u, int i, ULL v) {
	while (!in[u]) {
		ans[i] += v * Tree2
	}
}

bool Med;
signed main() {
	fprintf(stderr, "%.2lfMB\n", abs(&Med - &Mst) / 1048576.0);
	n = read(), m = read();
	for (int i = 1; i <= n; i++) a[i] = readull();
	for (int i = 1; i < n; i++) {
		int u = read(), v = read();
		Tree1::add(u, v);
	}
	for (int i = 1; i < n; i++) {
		int u = read(), v = read();
		e[u].push_back(v), e[v].push_back(u);
	}
	pre(1, 0), Tree1::pre();
	for (int j = 1; j <= 18; j++)
		for (int i = 1; i <= n; i++)
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
	Blocker::init();
	for (int i = 1; i <= m; i++) {
		x[i] = read(), y[i] = read(), k[i] = readull(), l1[i] = Tree1::lca(x[i], y[i]);
		Tree1::mdf(x[i], y[i], l1[i], k[i]), p1[i] = qry(x[i], i, 1), p2[i] = qry(y[i], i, 1);
		int l = lca(x[i], y[i]);
		p3[i] = qry(l, i, -2), ans[i] += Tree1::qry(l);
	}
	return 0;
}

詳細信息

answer.code: In function ‘void pre(int, int)’:
answer.code:42:39: error: ‘sz’ was not declared in this scope
   42 |         dfn[x] = ++tim, rnk[tim] = x, sz[x] = 1;
      |                                       ^~
answer.code: In function ‘int qry(int, int, long long unsigned int)’:
answer.code:155:31: error: ‘Tree2’ was not declared in this scope; did you mean ‘Tree1’?
  155 |                 ans[i] += v * Tree2
      |                               ^~~~~
      |                               Tree1
answer.code:157:1: warning: no return statement in function returning non-void [-Wreturn-type]
  157 | }
      | ^