Solution Set - NOI真题
NOI2024 RP++!
NOI2018
Day1T1
考虑一个最高的水位线使所有点通过没有积水的边就可以连通,也就是求出了一棵海拔的最大生成树。会发现只有这棵树上的边是可能开车经过的。建出 Kruskal 重构树,则固定水位时,每个点开车能到达的点是重构树的一棵子树。预处理出每个点走到 \(1\) 号点的最短路,然后查询子树最小值即可。至于确定这棵子树只需要倍增。
Day1T2
容易发现好排列等价于最长下降子序列不超过 \(2\)。考虑 DP,设 \(f_{i,j}\) 表示前 \(i\) 个数的最大值为 \(j\),此后的方案数。下一个数如果填大于 \(j\) 的数,方案数为 \(\sum_{k=j+1}^n f_{i+1,k}\);如果填小于 \(j\) 的数,就只能填最小值,方案数为 \(f_{i+1,j}\),当然在 \(i=j\) 的时候没有这种转移,可以认为 \(f_{i,\lt i}=0\)。因此,对所有 \(i\le j\),\(f_{i,j}=\sum_{k=j}^{n}f_{i+1,k}\)。
考虑这个东西的组合意义:\(f_{i,j}\) 表示从 \((i,j)\) 开始,每一步可以走到下一列的更高处,不跨过 \(y=x\),到达 \((n,n)\) 的方案数。 也就等价于每次向右向上走一个单位长度,走到 \((n,n)\) 的方案数。这是卡特兰数的经典模型。利用相同的证明方式,可以求出 \(f_{i,j}=C_{2n-i-j-1}^{n-i-1}-C_{2n-i-j-1}^{n-j-2}\)。
最后来考虑字典序的限制。来求前 \(i-1\) 位都相同,第 \(i\) 位更大的方案数。设此前的最大值为 \(mx\),未出现的最小值为 \(mn\),当前 \(q_i=v\)。容易发现方案数应该是 \(\sum_{k=\max(v,mx)+1}^{n}f_{i,k}=f_{i-1,\max(v,mx)+1}\)。但是当 \(v\in(mn,mx)\) 时,此后不再有合法方案。
时间复杂度 \(O(n)\)。
Day1T3
一个简单的问题是如何求 \(S\) 和 \(T\) 的公共子串数目。只要把 \(T\) 放在 \(S\) 的 SAM 和 \(T\) 的 SAM 上同时匹配即可。这里加一个线段树,判断是否有 endpos 在区间内即可。注意要暴力地减少长度而不是直接跳 slink,但是数据好像很水怎么写都能过。
Day2T1
用一个 multiset 模拟容易求出每一次选择的攻击力 \(k_i\)。然后问题等价于求最小的 \(x\),使得 \(p_i\mid a_i-k_ix\),且 \(a_i-k_ix\le 0\)。使用 exCRT 求解即可。
NOI2017
Day1T1
显然此题应当使用数据结构维护二进制位。那么直接使用 std::set 去维护所有极长的连续段。修改时把每个数拆成 \(\le 30\) 个二进制位依次修改,根据加减讨论一下即可。该做法需要大力卡常。不过现在CCF的机子已经很快了来着?
Day1T2
直接哈希就可以了。用链表维护,连接两个序列的时候计算交界处新产生的串的哈希值,插入哈希表里。断开两个序列时同理在哈希表中减掉。因为断开操作很少,每一次断开最多增加 \(O(k^2)\) 个串串,而初始是 \(O(nk)\) 个串,所以总的串串数目是 \(O(nk+ck^2)\) 的,总时间复杂度就是 \(O(nk+ck^2+\sum |s|)\),哈希表的常数忽略不计。
Day1T3
来求最大矩形面积不超过 \(s\) 的概率。因为选择的矩形一定要贴紧下边界,所以只需要关心每一列底部合法的高度。进一步,一个高度为 \(h\) 的矩形是由连续一段高度 \(\ge h\) 的部分构成的。那就可以设计 DP 状态:\(dp_{i,j}\) 表示已经有一段长度为 \(j\),高度 \(\ge i\) 的极长连续段,这部分合法的概率。转移枚举第一个高度等于 \(j\) 的位置 \(k\),有 \(dp_{i+1,k}dp_{i,j-k-1}p^{k}(1-p)\to dp_{i,j}\)。这个 \(k\) 也可能不存在,有 \(dp_{i+1,j}p^j\to dp_{i,j}\)。直接这样做的时间复杂度是 \(O(s^2\log s+ns)\) 的,因为合法的状态只有 \(ij\le s\),所以只有 \(j=0\) 的部分复杂度高。而 \(j=0\) 的部分是一个常系数齐次线性递推,可以用多项式取模进行优化。总的时间复杂度 \(O(s(s+\log n)\log s)\)。
Day2T1
“用车规则”的限制明示这道题应该使用 2-SAT 做。如果没有适合所有赛车的地图,那么直接 2-SAT 就做完了。而适合所有赛车的地图数量很少,所以可以枚举,将所有 \(x\) 换成 \(a\) 或 \(b\)。容易发现这样不会漏解。时间复杂度 \(O(2^dn)\)。
Day2T2
好神仙一题。
首先考虑“时间倒流”,每天会加入一些菜,菜可以无限期保存。这样“变质”就丢掉了。
然后建立费用流模型:
- 为第 \(t\) 天的第 \(i\) 种蔬菜建立点 \((t,i)\),连边 \(S\to(t,i)\),边权为 \(a_i\),容量为当天加入的菜的数目。
- 连边 \((t,i)\to (t+1,i)\),表示可以将蔬菜留到下一天。
- 为第 \(t\) 天建立一个点 \([t]\) 表示出售,连边 \((t,i)\to[t]\),连边 \([t]\to T\),容量为 \(m\)。
- 在菜 \(i\) 第一次出现的时间,从 \(S\to (t,i)\) 中分出一个流量,边权改为 \(a_i+s_i\)。
然后求解最大费用任意流。
接着通过模拟费用流找到反悔贪心。考虑从后向前依次加入每一天的出售点,观察会新形成怎样的“源汇路”或“环”。
结论是 \(S\) 的出边不会退流。也就是说,在未“时光倒流”的原问题中,每一天售卖蔬菜的最优方案包含上一天的最优方案。于是只用求出 \(\max p\) 天的最优方案,保留其中最贵的 \(p_jm\) 棵就得到 \(p_j\) 天的最优方案。
至于如何求出前 \(\max p\) 天的最优方案,回到费用流模型。这次可以换一个顺序处理:每次加入一天的所有蔬菜和出售点。可能的决策有两种:卖掉今天到达的某个菜,或者卖掉之前存下来的某个菜。于是拿一个堆维护一下所有菜的集合即可。
还是好抽象啊
Day2T3
Link.
谁家好人 NOI 出计算几何啊
Solution Set - NOI真题的更多相关文章
- NOI真题记录
NOI2001 食物链,拓展域并查集. 炮兵阵地,棋盘状压DP. NOI2002 银河英雄传说,kruskal重构树/带权并查集. 贪吃的九头龙,树形DP. NOI2003 逃学的小孩,树形DP,二次 ...
- PAT 甲级真题题解(1-62)
准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format 模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...
- 乘风破浪:LeetCode真题_041_First Missing Positive
乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_039_Combination Sum
乘风破浪:LeetCode真题_039_Combination Sum 一.前言 这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_038_Count and Say
乘风破浪:LeetCode真题_038_Count and Say 一.前言 这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...
- 乘风破浪:LeetCode真题_037_Sudoku Solver
乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决 这道题 ...
- 乘风破浪:LeetCode真题_036_Valid Sudoku
乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...
- 乘风破浪:LeetCode真题_035_Search Insert Position
乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...
- 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array
乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...
随机推荐
- C# SM2 解密 对接兴业银行业务
下载地址
- mybatis xml 文件 sql include 的用法
mybatis xml 文件中对于重复出现的sql 片段可以使用标签提取出来,在使用的地方使用标签引用即可具体用法如下: <sql id="Base_Column_List" ...
- .NET周刊【3月第3期 2024-03-24】
国内文章 Garnet: 力压Redis的C#高性能分布式存储数据库 https://www.cnblogs.com/InCerry/p/18083820/garnet_introduce 微软研究院 ...
- parameter常数及常数函数的使用
模型功能 常数在verilog设计中具备特殊的含义 一个可以由编译器进行处理的数 和C语言中常数一个不变的变量的作用不同 在verilog中,常数更多地作为预编译变量以提高设计的灵活性 在上一篇文章中 ...
- PS-AXI-PL流水灯设计(2)
PS-AXI-PL流水灯设计(2) 1.实验原理 承接上一次的实验,这里对AXI的总线结构做出分析,将AXI的理论具体对应到设计上去.为后面自己设计AXI的发送和接受器做好准备. 2.实验操作 (1) ...
- 网络设备性能指标之pps
基本概念: Bps:Byte per second 每秒传输多少字节 bps: bits per second 每秒传输多少位 ,这个也叫做端口速率 pps:Packet Per Second(包每秒 ...
- SpringBoot使用@Value注入静态属性
说明:SpringBoot中使用yml文件配置自定义属性,读取配置文件属性注入到实体类中,属性值都为静态属性 配置文件:yml #用户信息 userMag: userName: "王小波&q ...
- 怎么查看摄像头的硬件ID
1.打开设备管理器:电脑桌面左下角Windows图标点击鼠标右键,点击[设备管理器] 2.展开[照相机] 3.双击摄像头,弹出属性框 4.点击[详细信息],属性点击[硬件ID]
- HarmonyOS音频开发指导:使用AudioRenderer开发音频播放功能
AudioRenderer是音频渲染器,用于播放PCM(Pulse Code Modulation)音频数据,相比AVPlayer而言,可以在输入前添加数据预处理,更适合有音频开发经验的开发者,以 ...
- VMware Workstation之虚拟机NAT模式
[摘要] 三台虚拟机配置成NAT模式,实现三台虚拟机互通并可以访问互联网. 一.虚拟机配置为NAT,实现访问互联网和宿主机 1.虚拟网络编辑器配置 VMnat8为NAT的虚拟网卡,NAT模式可以基于D ...