社区讨论

求调qwq

P11234[CSP-S 2024] 擂台游戏参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m3342ao9
此快照首次捕获于
2024/11/04 22:23
去年
此快照最后确认于
2025/11/04 15:19
4 个月前
查看原帖
求调
CPP
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define int long long
using namespace std;

const int maxn = 1e5 + 5;
const int maxm = 7e6 + 5;
int n, m, a1[maxn], c[maxn], fa[maxm], tot, sum[maxn], b[25][maxn];
int k, a[maxm], s[maxm], rt, d[maxm], dep[maxm], cnt[maxm], cn[maxn];
bool f[maxm];

void read(){
	int x[4] = {0}; memset(f, 0, sizeof(f)); memset(cn, 0, sizeof(cn));
	for(int i = 0; i < 4; i++) cin >> x[i]; for(int i = 1; i <= k; i++) dep[i] = 1, cnt[i] = i, s[i] = i;
	for(int i = 1; i <= n; i++) a[i] = a1[i] ^ x[i % 4];
}

void build(int l, int r){
	queue<int> q;
	for(int i = l; i <= r; i++) q.push(i);
	while(q.size() > 1){
		int x = q.front(); q.pop();
		int y = q.front(); q.pop();
		fa[x] = fa[y] = ++tot; d[x] = y; d[y] = x;
		dep[tot] = dep[x] + 1; cnt[tot] = ++cn[dep[tot]];
		s[tot] = s[x] + s[y];
		q.push(tot);
	}
	if(!rt) rt = tot;
	else fa[rt] = fa[tot] = tot + 1, d[rt] = tot, d[tot] = rt, s[tot + 1] = s[tot] + s[rt], dep[tot + 1] = dep[tot] + 1, rt = ++tot, cnt[rt] = ++cn[dep[rt]];
}

void update(int u){
	if(u == rt) return;
	int v = d[u]; if(u > v) swap(u, v);
	s[fa[u]] = s[u] + s[v];
	int x = dep[u], y = cnt[fa[u]];
	if(b[x][y] && f[v]){
		if(a[v] >= x) s[fa[v]] = s[v], a[fa[v]] = a[v], f[fa[v]] = f[v];
		else s[fa[v]] = s[u], a[fa[v]] = a[u], f[fa[v]] = f[u];
		update(fa[v]);
	}
	if(!b[x][y] && f[u]){
		if(a[u] >= x) s[fa[v]] = s[u], a[fa[v]] = a[u], f[fa[v]] = f[u];
		else s[fa[u]] = s[v], a[fa[v]] = a[v], f[fa[v]] = f[v];
		update(fa[v]);
	}
}

void solve(){
	read(); tot = k; sum[1] = 1; f[1] = 1; rt = 0;
	for(int i = 2, j = 0; i <= n; i++){
		if(pow(2, j) < i) build(i == 2 ? 1 : (pow(2, j) + 1), pow(2, j + 1)), j++;
		f[i] = 1;
		update(i);
		sum[i] = s[rt];
	}
	int ans = 0;
	for(int i = 1; i <= m; i++) ans ^= (sum[c[i]] * i);
	cout << ans << '\n';
}

signed main(){
	freopen("arena.in", "r", stdin);
	freopen("arena.out", "w", stdout);
	ios::sync_with_stdio(false);
	cout.tie(0);
	cin.tie(0);
	
	cin >> n >> m;
	for(int i = 1; i <= n; i++) cin >> a1[i];
	for(int i = 1; i <= m; i++) cin >> c[i];
	k = ceil(log2(n));
	for(int i = 1; i <= k; i++){
		int x = pow(2, k - i);
		for(int j = 1; j <= x; j++){
			char ch; cin >> ch;
			b[i][j] = ch - '0';
		}
	} k = pow(2, k);
	int t; cin >> t; while(t--) solve();
	
	return 0;
}
/*
5 5
0 0 0 0 0
5 4 1 2 3
1001
10
1
1
1 2 1 0

*/

回复

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

正在加载回复...