专栏文章
7.12 模拟赛 G 题题解
题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miowz6zs
- 此快照首次捕获于
- 2025/12/03 02:31 3 个月前
- 此快照最后确认于
- 2025/12/03 02:31 3 个月前
题目:WiFi Password
别人的二分+ST表都是 的,我来一个 的做法。
观察到 OR 值随着区间的增长而不会减少,所以区间扩张满足单调性,所以考虑尺取法。
尺取法只需要顺便维护 OR 值即可。
多测要清空!!!
CPP#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int cnt[30];
int n, x;
int a[N];
int get() {
int ans = 0;
for (int i = 29; i >= 0; i--)
if (cnt[i] >= 1)
ans += (1 << i);
return ans;
}
int main() {
freopen("wifi.in", "r", stdin);
int t;
cin >> t;
while (t--) {
cin >> n >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 0; i <= 29; i++)
cnt[i] = 0;
int ans = 0;
for (int l = 1, r = 0; l <= n; l++) {
while (r < n) {
r++;
for (int i = 0; i <= 29; i++)
if (a[r] & (1 << i))
cnt[i]++;
// cout << l << " " << r << " " << get() << endl;
if (get() > x) {
for (int i = 0; i <= 29; i++)
if (a[r] & (1 << i))
cnt[i]--;
r--;
break;
}
}
if (get() <= x)
ans = max(ans, r - l + 1);
for (int i = 0; i <= 29; i++)
if (a[l] & (1 << i))
cnt[i]--;
}
cout << ans << endl;
}
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...