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 一.前言 这次我们还是要改造二分搜索,但是想法却 ...
随机推荐
- mybatis @Param参数 记录
报错信息 org.apache.ibatis.binding.BindingException: Parameter 'XX' not found. Available parameters are ...
- 整合mybatis-spring需要的maven依赖配置
创建maven项目,导入相关jar包 junit 1 <dependency> 2 <groupId>junit</groupId> 3 <artifactI ...
- #平衡树#洛谷 2611 [ZJOI2012]小蓝的好友
题目 在 \(R\times C\) 的矩形中,问有多少个子矩形使得存在一个给定点在其中, 保证点随机,\(R,C\leq 4\times 10^4,n\leq 10^5\) 分析 考虑容斥,用总方案 ...
- #状压dp#JZOJ 3853 帮助Bsny
题目 一共有\(n\)本书,混乱值是连续相同高度书本的段数. 可以取出\(k\)本书随意放回,问最小混乱值,高度\([25\sim 32]\) 分析 设\(f[i][j][k][mask]\)表示前\ ...
- [一本通1681]统计方案 题解(Meet in mid与逆元的结合)
题目描述 小\(B\)写了一个程序,随机生成了\(n\)个正整数,分别是\(a[1]-a[n]\),他取出了其中一些数,并把它们乘起来之后模\(p\),得到了余数\(c\).但是没过多久,小\(B\) ...
- C#实现的下拉多选框,下拉多选树,多级节点
今天给大家上个硬货,下拉多选框,同时也是下拉多选树,支持父节点跟子节点!该控件是基于Telerik控件封装实现的,所以大家在使用的过程中需要引用Telerik.WinControls.dll.Tele ...
- 持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项
自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOS SDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净.更智能.更精致.更易用的鸿蒙原生应用,和开发者共同成长 ...
- Centos环境部署SpringBoot项目
centos JDK Jenkins maven tomcat git myslq nginx 7.9 11.0.19 2.418 3.8.1 9.0.78 2.34.4 5.7.26 1.24.0 ...
- MogDB备机处于standby need-repair(WAL)状态
MogDB 备机处于 standby need-repair(WAL)状态 本文出处:https://www.modb.pro/db/402820 问题现象 Mogdb 主备环境,备机检查发现 Sta ...
- HarmonyOS非线性容器特性及使用场景
非线性容器实现能快速查找的数据结构,其底层通过hash或者红黑树实现,包括HashMap.HashSet.TreeMap.TreeSet.LightWeightMap.LightWeightSet ...