专栏文章
题解:AT_arc207_c [ARC207C] Combine to Make Non-decreasing
AT_arc207_c题解参与者 4已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @minnvn39
- 此快照首次捕获于
- 2025/12/02 05:28 3 个月前
- 此快照最后确认于
- 2025/12/02 05:28 3 个月前
来点简单好写做法。
考虑维护 表示 的最多段数, 表示在将 划分为最多段的情况下,最后一段最小能是多少。
从小到大扫描 ,设 表示 的值。这个可以每次将 从大到小枚举暴力更新直到 的值不变,那么此时比 更前的 显然也不会变了,因为一个数最多只能被更新 次,所以均摊下来暴力的复杂度是正确的。
我们现在要划分一个段 ,转移就是 。考虑贪心找到这个 ,显然是选择一个最大的转移点 满足 是最优的,因为 具有单调性, 越大, 越大,同时 越小,所以贪心是对的。
可以在每次更新 时去更新,所以复杂度也是对的。
综上,复杂度 。
CPP#include <bits/stdc++.h>
using namespace std;
constexpr int N = 200010;
int n, a[N], f[N], g[N], t[N];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
int x = 1;
for (int i = 1; i <= n; i++) {
for (int j = i; j >= 1; j--) {
if ((t[j] | a[i]) == t[j]) break;
t[j] |= a[i];
if (f[j - 1] <= t[j]) x = max(x, j);
}
f[i] = t[x];
g[i] = g[x - 1] + 1;
}
cout << g[n] << endl;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...