[赛记] 多校A层冲刺NOIP2024模拟赛11 12

news/2024/10/24 19:59:13/文章来源:https://www.cnblogs.com/PeppaEvenPig/p/18500356

冒泡排序 100pts

比较显然的签到题 (好久没这么水过了)

考虑这个错的冒泡排序,手模一下即可发现这个 $ +k $ 有点像以前做过的同余系中求和的问题,于是这个题同理,用 set 维护每个同余系的排名,最后按顺序输出即可;

对于正确性,相当于每次 $ +k $,则就相当于在一个同余系中排序;

时间复杂度:$ \Theta(n \log n) $;

点击查看代码
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
int n, k;
int a[5000005], ans[5000005];
multiset<int> s;
int main() {freopen("bubble.in", "r", stdin);freopen("bubble.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= k; i++) {s.clear();for (int j = i; j <= n; j += k) {s.insert(a[j]);}for (int j = i; j <= n; j += k) {ans[j] = *s.begin();s.erase(s.begin());}}for (int i = 1; i <= n; i++) cout << ans[i] << ' ';return 0;
}

染色 4pts

给了1G原来是用在了bitset上

转化题意:对于最终的序列,如1 1 1 1 1 2 2 3 3 3,将其去重后变为 1 2 3,则其合法当其为原序列 $ a $ 的子序列时;

正确性很正确(但确实想不到)

那么设 $ f_i $ 表示长度为 $ i $ 的本质不同的子序列个数,那么最终的答案即为 $ \sum_{i = 1}^{n} C_{n - 1}^{i - 1} f_i $;

证明考虑插板法;

那么我们的问题变为了求本质不同的子序列个数,但是子序列的任意相邻两项不相等;

发现原来的不太好转移,那么多开一维,设 $ f_{i, j} $ 表示长度为 $ i $,结尾是 $ j $ 的本质不同的子序列个数,则有转移:$ f_{i, a_i} = \sum_{j = 1}^{m} f_{i - 1, j} \ (j \not= a_i) $;

那么这东西是 $ \Theta(nm) $ 的,发现长度只能是 $ 0 \ 1 $,于是我们可以将 $ i $ 这一维用 bitset 优化,复杂度 $ \Theta(\frac{nm}{w}) $;

具体实现上需要注意一些细节,比如 $ f_{i, j} $ 的基础为 $ 1 $,我们要加上这个 $ 1 $,再如维护 $ \sum_{j = 1}^{m} f_{i - 1, j} $ 时需要先减去 $ f_j $ 再更新 $ f_j $;

有一些技巧:模 $ 2 $ 意义下的的加减操作相当于异或(奇数 + 奇数 = 偶数,剩下的都是奇数),$ C_{n}^{m} \mod 2 = [(n \ \And \ m) = m] $(证明考虑Lucas);

点击查看代码

这场挂分挺多,算是给后天攒RP了吧

Alice 和璀璨花 100pts

树状数组维护最长上升子序列,时间复杂度 $ \Theta(n \log n) $;

注意要先离散化,然后发现乘积项无法离散化,不过没有关系,直接将其赋值到比它小于等于的那个位置即可(因为求的是最长上升子序列所以没有影响,但如果这题求得是最长不下降可能就得用权值线段树了,时间复杂度 $ \Theta(n \log V) $,其中 $ V $ 为值域);

点击查看代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
long long a[1000005], b[1000005], c[5000005], f[1000005];
int cnt;
namespace BIT{inline int lowbit(int x) {return x & (-x);}long long tr[5000005];void add(int pos, long long d) {for (int i = pos; i <= cnt; i += lowbit(i)) tr[i] = max(tr[i], d);}long long ask(int pos) {long long ans = 0;for (int i = pos; i; i -= lowbit(i)) ans = max(ans, tr[i]);return ans;}
}
using namespace BIT;
long long ans;
int main() {freopen("alice.in", "r", stdin);freopen("alice.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];c[++cnt] = a[i];}for (int i = 1; i <= n; i++) {cin >> b[i];c[++cnt] = b[i];}c[++cnt] = 0;c[++cnt] = -1;sort(c + 1, c + 1 + cnt);cnt = unique(c + 1, c + 1 + cnt) - c - 1;for (int i = 1; i <= n; i++) {f[i] = ask(lower_bound(c + 1, c + 1 + cnt, a[i]) - c - 1) + 1;ans = max(ans, f[i]);int pos = lower_bound(c + 1, c + 1 + cnt, a[i] * b[f[i]]) - c;if (c[pos] != a[i] * b[f[i]]) pos--;add(pos, f[i]);}cout << ans;return 0;
}

David 与和谐号 8pts

呵呵,部分分暴搜,正解就换了种搜+剪了个枝;

好吧暴搜挂完了,36pts -> 8pts,调参少了一个;

正解是迭代加深搜索,并且剪了个枝;

发现我们的搜索树可能会很深,但答案很浅,所以可以迭代加深搜索(IDA*);

所谓IDA*,即每次固定一个搜索上界(设为 $ up $ ),超了就返回;

对于这个题,还有一个剪枝,就是当当前搜索到的深度的估价函数 $ D(x) $ 加上当前搜索位置大于我们所规定的上界时就返回;

$ D(x) $ 怎么算?发现当前状态中,如果相邻两项 $ a_i, a_{i - 1} $ 的差 $ | a_i - a_{i - 1} | \geq 2 $ 就至少要转一次。那么记这种状态的出现次数为 $ sum $,则 $ D(x) = sum $;

所以当 $ D(x) + x > up $ 时就返回,这样就能过了;

时间复杂度:$ \Theta(能过) $;

注意在判断 $ D(x) + x > up $ 时先判断 $ x > up $ 的情况,或者直接在更新答案之前判断 $ D(x) + x > up $ 的情况也行;

点击查看代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int t;
int n;
int a[55];
int ans;
void dfs(int x, int ls, int up, int sum) {if (ans <= x - 1) return;if (x - 1 > up) return;bool vis = true;for (int i = 1; i <= n; i++) {if (a[i] != i) {vis = false;break;}}if (vis) {ans = min(ans, x - 1);return;}if (x - 1 + sum > up) return;for (int i = 2; i <= n; i++) {if (i == ls) continue;int now = sum + ((i < n) && (abs(a[i] - a[i + 1])) == 1) - ((i < n) && abs(a[1] - a[i + 1]) == 1);reverse(a + 1, a + 1 + i);dfs(x + 1, i, up, now);reverse(a + 1, a + 1 + i);}
}
int main() {freopen("david.in", "r", stdin);freopen("david.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> t;while(t--) {cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];bool vis = true;for (int i = 1; i <= n; i++) {if (a[i] != i) {vis = false;break;}}if (vis) {cout << 0 << '\n';continue;}int sum = 0;for (int i = 2; i <= n; i++) {if (abs(a[i] - a[i - 1]) >= 2) sum++;}ans = 0x3f3f3f3f;int i = 1;while(ans == 0x3f3f3f3f && i <= 2 * n + 2) {dfs(1, 0, i, sum);i++;}cout << ans << endl;}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一,超级详细的ClickHouse安装部署文档(RPM版安装),新手小白一看就能学会!!!

ClickHouse安装部署博客笔记(RPM版) 前言 ClickHouse是一个高性能的列式数据库,专为在线分析处理(OLAP)而设计。它能够实时生成分析数据报告,并支持对大数据进行快速的查询。本文将带你一步步完成ClickHouse的单机安装部署,确保你能够顺利上手这个强大的数据库系统。 第…

STM32配置HID设备时主机识别不到力反馈的解决办法

这个问题困扰我快一个星期了,我仔仔细细阅读了Device Class Definition for Physical Interface Devices (PID) Version 1.0和HID Usage Tables FOR Universal Serial Bus (USB)。 都没有找到识别不到力反馈的原因,按理说配置完报告描述符就能显示力反馈了,但是我这边死活识…

VSCode Java环境配置

JDK 部分 1. 下载 java jdk jdk23下载地址 windows 选择 Windows / x64 zip 文件 2. 解压 将 zip 文件移动到你想要的路径下并解压,如: E:\openjdk-23.0.1_windows-x64_bin 解压后复制 bin 文件路径,如: E:\openjdk-23.0.1_windows-x64_bin\jdk-23.0.1\bin 3. 配置环境变…

第8课 项目管理工具禅道

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天创公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理…

支付通道网络(PCN)研究

背景 为了缓解主链吞吐量和交易费用的弊端,支付通道网络的技术被提出。交易的双方节点可以通过智能合约搭建一个支付通道,双方各锁定一定数量的初始资金,进行无限次的链下交易,这些交易不会被发布在区块链上,直到通道关闭,才会最终提交到链上。 PCN的问题多跳支付依赖于中…

23~24 炼石计划 NOIP 练习题部分题解

其实还是不加密码了目录 目录第 1 组JOISC2017 火车旅行IOI2018 会议CF1558F Strange SortAPIO2018 新家CTSC2017 密钥CF1748E Yet Another Array Counting Problem第 2 组NOI2016 区间LOJ552 MIN&MAX IJOISC2023 合唱LOJ542 序列划分LOJ560 Menci 的序列P8978 中位数第 3 …

指令2(不完整)

一、CMP指令MOV EAX,100 MOV ECX,100 CMP EAX,ECX 这个主要是通过观察Z位来判断EAX和ECX两个数相不相等 先用mov将eax和ecx变成100再进行相减,得到eax为0ecx为100,z位为1再将eax改成100,把所有标志寄存器改为0,输入指令CMP EAX,ECX 只有标志寄存器发…

RTE 2024 隐藏攻略

大家好!想必今年 RTE 大会议程大家都了解得差不多了,这将是一场实时互动和多模态 AI builder 的年度大聚会。大会开始前,我们邀请了参与大会策划的 RTE 开发者社区和超音速计划的成员们,分享了不同活动的亮点和隐藏攻略。请收藏好,开启你的 RTE 2024 之旅吧! 大会基本信息…

帝国CMS忘记后台登录认证码处理方法

查看配置文件:打开 e/class/config.php 文件(对于帝国CMS 7.5,路径为 e/config/config.php)。 查找 $ecms_config[esafe][loginauth] 变量的内容。忘记后台登录安全答案登录数据库:使用数据库管理工具(如phpMyAdmin)登录到你的数据库。找到用户附加表:寻找名为 phome_e…

忘记帝国CMS后台密码的解决方法

使用phpMyAdmin重置密码登录phpMyAdmin打开浏览器,输入phpMyAdmin的访问地址,通常为 http://yourdomain.com/phpmyadmin。 使用数据库管理账号登录。选择数据库在左侧的数据库列表中,找到并点击包含 phome_enewsuser 表的数据库。修改用户表点击 phome_enewsuser 表。编辑用…

苹果CMS v10 忘记管理员密码的重置方法

如果你忘记了苹果CMS v10的后台管理密码,可以通过以下步骤进行重置:备份数据库:在进行任何数据库操作之前,请确保备份当前的数据库,以防止数据丢失。登录数据库:使用数据库管理工具(如phpMyAdmin)登录到你的数据库。如果你使用的是宝塔面板,可以通过宝塔面板的数据库管…

码上狂欢 | 1024程序员节,免费领取你的技能加油包!

​祝程序员们节日快乐! 今天是10月24日,一个特别的日子——程序员节。在这个节日,我们聊聊程序员比较热门的职业发展方向。 对于有理工科背景的程序员来说,有两个方向是非常有发展前景的。所谓前景,就是岗位多、薪资高、未来前途广阔,适合作为长远职业规划的方向。这两个…