逐月破星杯
C. 区间排序
题目描述
给定一个数组
- 将
分割成互不相交的子段,且每个元素恰好属于一个子段。 - 准备一个空数组
,按顺序把这些子段完整地插入到 中的任意位置。
求至少要分成几个子段。
思路
很明显我们会贪心的尽可能长的取子段直到不能取。所以我们来考虑怎么判断非法。
- 如果当前元素小于上个元素,那么很明显不能放在同一段。
- 或者如果当前元素大于原数组中第一个大于
( 是当前区间左端点)的元素,那么也不能放在同一段。因为当前子段一定会插在其之前,所以不能大于它。
使用 set
维护即可。
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000001;
int n, a[MAXN], ans;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
set<int> s;
s.insert(0), s.insert(1000001);
for(int i = 1, j = 1; i <= n; i = j) {
int x = *s.upper_bound(a[i]);
for(; j <= n && (i == j || a[j] >= a[j - 1]) && a[j] <= x; ++j) {
}
ans++;
for(int k = i; k < j; s.insert(a[k]), ++k) {
}
}
cout << ans;
return 0;
}
D. 精准拼接
题目描述
给定两个长为
。- 对于
,都有 。
思路
令
令
我们可以这样使用
- 此时明显
已经确定,所以我们可以枚举 。 - 由于我们知道要求
,所以我们还可以求出 。直接转移即可。
并这样更新
- 这次是
已经确定,同样枚举 。同理 也确定了,直接更新即可。
空间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100001;
int n, a[MAXN], pop[1 << 20], maxdp[21][1 << 10][1 << 10], pos[11][1 << 10][1 << 10], fa[MAXN], ans, p;
void Print(int x) {
if(!x) {
return;
}
Print(fa[x]);
cout << x << " ";
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
freopen("stitch.in", "r", stdin);
freopen("stitch.out", "w", stdout);
cin >> n;
for(int i = 1; i < (1 << 20); ++i) {
pop[i] = pop[i - (i & -i)] + 1;
}
for(int i = 1; i <= n; ++i) {
cin >> a[i];
}
for(int i = 1, x, dp; i <= n; ++i) {
cin >> x;
dp = 1;
for(int j = 0; j < (1 << 10); ++j) {
int v = x - pop[j & (a[i] >> 10)];
if(v >= 0 && maxdp[v][j][a[i] & ((1 << 10) - 1)] + 1 > dp) {
dp = maxdp[v][j][a[i] & ((1 << 10) - 1)] + 1, fa[i] = pos[v][j][a[i] & ((1 << 10) - 1)];
}
}
if(dp > ans) {
ans = dp, p = i;
}
for(int j = 0; j < (1 << 10); ++j) {
int v = pop[a[i] & j];
if(dp > maxdp[v][a[i] >> 10][j]) {
maxdp[v][a[i] >> 10][j] = dp, pos[v][a[i] >> 10][j] = i;
}
}
}
cout << ans << "\n";
Print(p);
return 0;
}
本文作者:yaosicheng124
本文链接:https://www.cnblogs.com/yaosicheng124/p/18490303
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步