社区讨论

10分求助

P10783【MX-J1-T3】『FLA - III』Anxiety参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mcdgoyjy
此快照首次捕获于
2025/06/26 22:11
8 个月前
此快照最后确认于
2025/06/27 18:16
8 个月前
查看原帖
CPP
#include <iostream>
#include <vector>
using namespace std;

typedef long long LL;
const int N = 18, M = 1 << N;

int n, m, dep[M];
long long s[M][N];

void dfs(int x) {
	dep[x] = dep[x / 2] + 1;
	if (dep[x] == n) {
		for (int i = 1; i <= n; i++) s[x][i] = s[x][0];
		return;
	}
	dfs(x * 2), dfs(x * 2 + 1);
	for (int i = 1; i <= n; i++)
		s[x][i] = s[x][0] + s[x*2][i-1] + s[x*2+1][i-1];
}

long long query(int x, int y, int k) {
	if (x > y) swap(x, y);
	vector<int> gx, gy;
	while (dep[y] > dep[x]) gy.push_back(y), y /= 2;
	while (x != y) {
		gx.push_back(x), x /= 2;
		gy.push_back(y), y /= 2;
	}
	gx.push_back(x);
	for (int i = gy.size() - 1; i >= 0; i--)
		gx.push_back(gy[i]);
	int u, t;
	long long res = 0;
	if (gx.size() & 1) {
		t = gx.size() / 2, u = gx[t], t = k - t;
		if (t >= 0) res = s[u][min(t, n)];
	} else {
		t = gx.size() / 2, u = gx[t], t = k - t;
		if (t >= 0) res = s[u][min(t, n)];
		if (t > 0) res += s[u ^ 1][min(t - 1, n)];
		u /= 2, res += s[u][0];
	}
	for (int i = t; i && u / 2; i--, u /= 2) {
		res += s[u / 2][0];
		if (i > 1) res += s[u ^ 1][min(n, i - 2)];
	} 
	return res;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i < 1 << n; i++) scanf("%lld", &s[i][0]);
	dfs(1);
	while (m--) {
		int x, y, k;
		scanf("%d%d%d", &x, &y, &k);
		printf("%lld\n", query(x, y, k));
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...