社区讨论
求调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 条回复,欢迎继续交流。
正在加载回复...