NOI2024 RP++!

NOI2018

Day1T1

Link&Submission.

考虑一个最高的水位线使所有点通过没有积水的边就可以连通,也就是求出了一棵海拔的最大生成树。会发现只有这棵树上的边是可能开车经过的。建出 Kruskal 重构树,则固定水位时,每个点开车能到达的点是重构树的一棵子树。预处理出每个点走到 \(1\) 号点的最短路,然后查询子树最小值即可。至于确定这棵子树只需要倍增。

Day1T2

Link&Submission.

容易发现好排列等价于最长下降子序列不超过 \(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

Link&Submission.

一个简单的问题是如何求 \(S\) 和 \(T\) 的公共子串数目。只要把 \(T\) 放在 \(S\) 的 SAM 和 \(T\) 的 SAM 上同时匹配即可。这里加一个线段树,判断是否有 endpos 在区间内即可。注意要暴力地减少长度而不是直接跳 slink,但是数据好像很水怎么写都能过。

Day2T1

Link&Submission.

用一个 multiset 模拟容易求出每一次选择的攻击力 \(k_i\)。然后问题等价于求最小的 \(x\),使得 \(p_i\mid a_i-k_ix\),且 \(a_i-k_ix\le 0\)。使用 exCRT 求解即可。

NOI2017

Day1T1

Link&Submission.

显然此题应当使用数据结构维护二进制位。那么直接使用 std::set 去维护所有极长的连续段。修改时把每个数拆成 \(\le 30\) 个二进制位依次修改,根据加减讨论一下即可。该做法需要大力卡常。不过现在CCF的机子已经很快了来着?

Day1T2

Link&Submission.

直接哈希就可以了。用链表维护,连接两个序列的时候计算交界处新产生的串的哈希值,插入哈希表里。断开两个序列时同理在哈希表中减掉。因为断开操作很少,每一次断开最多增加 \(O(k^2)\) 个串串,而初始是 \(O(nk)\) 个串,所以总的串串数目是 \(O(nk+ck^2)\) 的,总时间复杂度就是 \(O(nk+ck^2+\sum |s|)\),哈希表的常数忽略不计。

Day1T3

Link&Submission.

来求最大矩形面积不超过 \(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

Link&Submission.

“用车规则”的限制明示这道题应该使用 2-SAT 做。如果没有适合所有赛车的地图,那么直接 2-SAT 就做完了。而适合所有赛车的地图数量很少,所以可以枚举,将所有 \(x\) 换成 \(a\) 或 \(b\)。容易发现这样不会漏解。时间复杂度 \(O(2^dn)\)。

Day2T2

Link&Submission.

好神仙一题。

首先考虑“时间倒流”,每天会加入一些菜,菜可以无限期保存。这样“变质”就丢掉了。

然后建立费用流模型:

  • 为第 \(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真题的更多相关文章

  1. NOI真题记录

    NOI2001 食物链,拓展域并查集. 炮兵阵地,棋盘状压DP. NOI2002 银河英雄传说,kruskal重构树/带权并查集. 贪吃的九头龙,树形DP. NOI2003 逃学的小孩,树形DP,二次 ...

  2. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  3. 乘风破浪:LeetCode真题_041_First Missing Positive

    乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...

  4. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  5. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  6. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  7. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  8. 乘风破浪:LeetCode真题_036_Valid Sudoku

    乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...

  9. 乘风破浪:LeetCode真题_035_Search Insert Position

    乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...

  10. 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array

    乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...

随机推荐

  1. KingbaseES V8R6 最老事务阻止vacuum freeze

    前言 最近生产环境发生几次由于长事务导致表.库年龄没法回收的情况.我们要规避这种情况的发生,不要等发生了再去强制中断会话连接. 当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为froz ...

  2. KingbaseES sys_restore 恢复表时默认不包括表上的索引

    前言 最近碰到一个案例,在使用sys_restore恢复指定表时,默认不恢复表上的索引,如果想恢复需要单独指定. 测试过程 [](javascript:void(0) 查看表的有关属性:test=# ...

  3. redis的延迟双删策略

    1,redis数据为什么会存在和数据库数据不一致的问题 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改redis中的数据 ...

  4. 02 jQuery选择器

    02 jQuery选择器 jQuery的逻辑和css选择器的逻辑是一样的. // 语法: $(选择器) 可以使用jQuery选择器快速的对页面结构进行操作. 案例: <!DOCTYPE html ...

  5. #dp#洛谷 3244 [HNOI2015]落忆枫音

    题目 分析 每个有入度的点可以选择任意一个父节点组成一棵树,那么原来的答案就是 \(\prod_{i=2}^ndeg[i]\) 现在多了一条边,如果边的终点是1或者它是一个自环那么可以不用管这条边. ...

  6. #trie,树链剖分#洛谷 6088 [JSOI2015]字符串树

    题目 分析 显然树上的问题可以转换成根节点到两点的答案减去2倍根节点到LCA的答案 化边为点,考虑子节点承接父节点的trie,再加入一条新的字符串, 在循环的过程中统计一个位置被多少个字符串经过, 这 ...

  7. SQLAlchemy详解

    一.SQLAlchemy介绍 SQLAlchemy 是 Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性. SQLAlchemy支持SQLite.Pos ...

  8. 圈重点!一图读懂OpenHarmony技术日

     

  9. 金融App面临安全风险?解锁HMS Core安全检测服务解决方案

    数字经济时代,金融类App成为人们理财.购买证券股票以及办理各项银行业务的重要载体.科技驱动着金融行业的转型升级,但在创新发展的同时,金融App面临的安全风险类型与场景也在持续增加.如何更好地规避安全 ...

  10. mysql 必知必会整理—sql 正则表达[五]

    前言 简单整理一下sql 正则表达式. 正文 正则表达式是用来匹配文本的特殊的串(字符集合).如果你想从一个文本文件中提取电话号码,可以使用正则表达式.如果你需要查找名字中间有数字的所有文件,可以使用 ...