逐月破星杯

news/2024/10/21 20:36:35

C. 区间排序

题目描述

给定一个数组 \(A\),你要按照如下方式对 \(A\) 排序:

  1. \(A\) 分割成互不相交的子段,且每个元素恰好属于一个子段。
  2. 准备一个空数组 \(B\),按顺序把这些子段完整地插入到 \(B\) 中的任意位置。

求至少要分成几个子段。

思路

很明显我们会贪心的尽可能长的取子段直到不能取。所以我们来考虑怎么判断非法。

  • 如果当前元素小于上个元素,那么很明显不能放在同一段。
  • 或者如果当前元素大于原数组中第一个大于 \(A_l\)\(l\) 是当前区间左端点)的元素,那么也不能放在同一段。因为当前子段一定会插在其之前,所以不能大于它。

使用 set 维护即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(N\log N)\)

代码

#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. 精准拼接

题目描述

给定两个长为 \(N\) 的数列 \(A,k\)。你要找出一个最长的且满足以下条件的数列 \(p_1,p_2,\dots,p_m\)

  • \(1\le p_1<p_2<\dots<p_m\le N\)
  • 对于 \(\forall 1<i\le m\),都有 \(\text{popcount}(A_{p_{i-1}}\text{AND} A_{p_i})=k_{p_i}\)

思路

\(dp_{i}\) 表示以 \(i\) 结尾的满足条件的子序列的最长长度。

\(maxdp_{i,j,k}\) 表示一个转移 \(a\rightarrow b\) 满足 \(A_a\) 二进制下最高 \(10\) 位为 \(i\)\(A_b\) 二进制下最低 \(10\) 位为 \(j\)\(A_a,A_b\) 的最低十位的 \(\text{popcount}\)\(k\) 中最大的 \(dp_a\)

我们可以这样使用 \(maxdp\) 转移(收集型):

  • 此时明显 \(j\) 已经确定,所以我们可以枚举 \(i\)
  • 由于我们知道要求 \(k_i\),所以我们还可以求出 \(k\)。直接转移即可。

并这样更新 \(maxdp\)

  • 这次是 \(i\) 已经确定,同样枚举 \(j\)。同理 \(k\) 也确定了,直接更新即可。

空间复杂度 \(O(N+V^2\log V)\),时间复杂度 \(O(NV)\),其中 \(V=2^{10}\)

代码

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告 1.实验内容 1.1 本周学习内容 1.1.1 后门介绍后门概念:不经过正常认证流程而访问系统的通道 后门类型:编译器、操作系统、应用程序中的后门,潜伏于OS或伪装成APP的后门程序1.1.2 后门案例编译器后门:Xcode 操作…

tms fnc ui

tms fnc uitms fnc ui 这组界面控件,支持DELPHI的VCL和FMX,还支持FPC的LCL。 1)TTMSFNCNavigationPanel2)TTMSFNCTileList3)本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18490245

第6课 测试用例设计

1.黑盒测试方法2.白盒测试方法术语一: • 动态测试(dynamic testing):通过运行软件的组 件或 系统来测试软件 • 静态测试(static testing):对组件的规格说明书 进行 评审,对静态代码进行走查 • 正式评审(formal review):对评审过程及需求文 档的 一种特定评审 • …

转载 兔兔电脑机器码修改工具1.0

使用说明: 1.关闭**毒软件(1.易语言编写可能会误报 2.需要修改系统信息可能会被拦截); 2.管理员运行; 3.根据需要修改机器码(部分系统需要运行兼容性初始化) 4.修改主板会屏蔽网卡,所以要先修改网卡然后再修改主板; 5.重启电脑即可恢复,网卡修改不会恢复,需要手动改…

机器学习基本介绍

1、人工智能概述 人工智能发展必备三要素:数据 算法 计算力 CPU,GPU,TPU计算力之CPU、GPU对比:CPU主要适合I\O密集型的任务GPU主要适合计算密集型任务 1.1、工智能、机器学习和深度学习的关系人工智能和机器学习,深度学习的关系:机器学习是人工智能的一个实现途径深度学习…

考场环境 NoiLinux 测试

觉得还是有必要提前练一下 用的是官网的 NoiLinux.iso 全程断网下载 虽然不知道实机预安装系统时是不是断网的 NoiLinux,但是保险一点还是选了断网省选的时候,Windows 里只有画图和 Dev-C++分辨率非常构式,需要手动调分辨率,咱们电脑是 1920*1080(没找到适配这个电脑的分辨…

面试题速刷 - 知识广度2

有哪些前端攻击?如何预防? XSS 跨站脚本攻击预防:尖括号替换,Vue中用插值{}不会发生XSS攻击。 CSRF 跨站请求伪造预防:服务端严格控制跨域,验证机制二次确认 SameSite禁止第三方cookie 点击劫持演示一下:预防: 1.判断两个iframe域名是否一致 2.让当前网页只在自己ifram…