2023ZR-NOIP二十连

好多不会做又不想抄怎么办???

Day1

A-游戏

当前局面必败当且仅当后继状态全部必胜,当前局面必胜当且仅当存在一个后继状态必败。

打表观察 SG 函数或者暴力搜出所有状态拓扑,可以发现后手必胜当且仅当 \(m = 0\)。初始集合为空是后手必胜,否则初始状态 \(a\) 必然包含 \(1\)。观察拿掉 \(1\) 之后的局面,如果后继局面 \(b\) 必败,那么拿走 \(1\) 即可使对手必败。否则 \(b\) 是一个必胜局面,那么后继的局面必然存在一个必败的后继局面 \(c\),而 \(b \to c\) 是通过拿走了某个数 \(x\) 实现的。考虑在本轮直接拿走 \(x\),那么会顺带着拿走 \(1\),于是直接实现了 \(a \to c\),这样留给后手的依然是一个必败局面。至此得证。

B-涂鸦

爆搜出所有局面并哈希状态,记录下局面的转移过程,暴力高消做到 \(\mathcal O((2^{nm})^3)\)

划分等价类。考虑把点的状态分成两类,一种是操作当前点合法之后不会再改变,一种是当前无论如何操作对该点的影响后面都会被覆盖掉。后者的原因在于该点右下角的矩阵仍存在和终态不同的位置,就算当前操作使得这个位置合法了,未来也可能要不合法回来。所以后者的值其实并不重要,前者一定是在右下角堆成一个阶梯状,那么总共的状态就变成了 \(\binom{n+m}{n}\) 这么个量级。每次操作了一个位置 \((i,j,c)\),影响到的只有左上角这么个矩形,对于左上角的一个位置 \((x,y)\),只需要检查 \((x,y)\)\((i,j)\) 之间的这个矩形是否全为 \(c\),以及 \((x+1,y)\)\((x,y+1)\) 是否状态为前者即可。根据这些内容再列方程高消,复杂度为 \(\mathcal O(\binom{n+m}{n}^3)\)

C-迷路

一眼感觉是做过的题,加强了 114514 倍。按照那个题预处理信息之后,考虑根据到标记点的步数差异在第几位来划分等价类,记 \(f_{i,j}\) 表示考虑了前 \(i\) 个等价类,选了 \(j\) 个位置使得他们在不同等价类中的方案数。假如说当前选出的等价类大小分别为 \(a_1,a_2,a_3 \cdots a_p\),方案数即为 \([x^r] \Pi_{i = 1}^p (1 + a_{i}x)\),动态维护这个多项式即可,注意到等价类只会分裂 \(\mathcal O(nm)\) 次,对于一个大小为 \(a\) 的等价类分裂成两个大小为 \(b\)\(c\) 的,那么对多项式的影响就是除以 \((1 + ax)\) 然后乘上 \((1 + bx)(1 + cx)\),这可以在 \(\mathcal O(r)\) 的时间内解决。总复杂度 \(mathcal O(nm (k + r))\),巨大常数使得我在这题中处于极大劣势。

D-潘多拉的魔盒

Day2

A-花菖蒲

sol 貌似是拉一条链然后挂叶子。节点数这个限制非常宽泛,所以咋做都能过,我的做法比较奇怪。

先特判 \(0 0\) 答案是 \(1\)。当 \(b = 0\) 是构建一个菊花,特判 \(a = 2\)\(2\) 个点,其它都是 \(a + 1\) 个点,多拿出一个点向外扩散即可。否则建出一棵二叉树,先多拿出一个点当做根,然后按二叉树的结构连出 \(b\)非叶子节点,显然这些点都有父亲、左二子、右儿子,即都是三度点,此时还会有 \(a + 2\) 个叶子节点,它们都是一度点,据此得出 \(a < b + 2\) 时无解。然后再在根上连出 \(a - b - 2\) 个一度点即可。这里还需要特判一个 \(a = b + 3\) 的情况,手玩可以知道无论如何都不存在解。复杂度 \(\mathcal O(a)\),二叉树部分可以队列辅助实现。

B-百日草

答案的上界在 \(\max_{i = 1}^{m} w_i \times m\),量级在 \(10^{15}\),先二分一个答案 \(ans\),设 \(f_i\) 表示在当前答案下合法的走到点 \(i\) 最少需要经过几条边,所以转移 \(f_v = f_u + 1\) 的充要条件是 \(f_{u} \times w_i \geq ans\),扩展的过程是贪心的最短路,边权都是 \(1\) 所以直接 bfs 即可,如果能扩展的 \(n\) 号点则说明当前答案合法。几个技巧是二分上界不要开 \(10^{18}\),扩展到 \(n\) 后直接跳出。复杂度 \(\mathcal O(n \log V)\),场上不知道为啥脑抽写 dijkstra,叠 buff 太多被卡成 80 了。

C-紫丁香

定义边的状态为选或不选,点的状态定义为度数的奇偶性。观察到将一条边的状态取反,相当于将它的两个端点状态都取反。对于任意两个点,可以将他们间一条简单路径上边的状态都取反,从而使得这些操作只使得这两个点的状态取反,证明是简单的。至此,可以得到最终的状态要么所有点的度数都是奇数,要么只有一个点的度数为偶数。假设初始所有边都选,如何构造出点数的上界?由于要求字典序最大,所以以序号为边权,求出最大生成树后在树上操作,这样就能尽可能保留编号小的边。将初始度数为偶数的点拿出来,如果是偶数个,随便两两配对后进行路径上的操作即可,手玩可以得出树的形态一定的话,答案做出来的选的边也是一定的。如果是奇数个,说明两两配对后会剩下一个。以这个节点 \(x\) 为根遍历整棵生成树,对于其它任意节点 \(y\),看能否再操作一次 \((x,y)\) 使得答案更优,这个过程即为对于每条边,找到到根节点的路径上第一条编号比它小的边,断掉后在两者间再连边求答案。sol 的实现是维护一个线段树,实际只需要两个栈就可以做到线性,复杂度 \(\mathcal O(n + m)\),似乎常数太大被干碎了。还有更神秘的并查集做法,跑的嘎嘎快,以后再学。

D-麒麟草

Day3

A-你

如果没有 f 操作,行列是独立的,直接 \(O(1)\) 交换行列标号即可。有 f 操作通过维护的当前行列标号映射得到实际要交换的位置,直接在原数组交换即可。复杂度 \(\mathcal O(nm + q)\)

B-有点太

原题

\(f_{i,j}\) 表示 \(i\)\(j\) 最多大多少,\(g_{i,j}\) 表示 \(i\)\(j\) 最少大多少。根据初始关系,可以有:

  • \(i = j \to f_{i,j} = g_{i,j} = 0\)
  • \(i > j \to f_{i,j} = 2,g_{i,j} = 1\)
  • \(i < j \to f_{i,j} = -1,g_{i,j} = -2\)
  • \(i ? j \to f_{i,j} = 2,g_{i,j} = -2\)

然后跑差分约束得到全局两两间的关系,可以直接 floyd 来做。最后枚举右边加的两个砝码 \(i,j\) 统计答案:

  • \(g_{A,i} > f_{j,B} \vee g_{A,j} > f_{i,B}\) 左边可能重于右边
  • \(g_{i,A} > f_{B,j} \vee g_{i,B} > f_{A,j}\) 右边可能重于左边
  • \(f_{A,i} = g_{A,i} = f_{j,B} = g_{j,B} \vee f_{A,j} = g_{A,j} = f_{i,B} = g_{i,B}\) 两边可能重量相等

瓶颈在于 floyd 跑差分约束,复杂度 \(\mathcal O(n^3)\)。sol 的做法是根据大小关系连边,相同大小的缩点,可以得到一个不超过三层的 DAG。枚举选的砝码的质量然后根据关系对剩下的砝码分配重量看是否合法,这样也是 \(\mathcal O(n^3)\) 的,但是带的常数巨大,不如差分约束。

C-极端

首先如果一个店里的顾客看不到广告,那么不妨给这个店铺贴上一个广告,所以最后答案的形态一定是对于每个店铺要么能看到广告,要么贴了广告,不可能出现空着的情况。

D-了

Day4

A-正在出模拟赛

首先并不关心每场比赛具体有谁打。最多只有 \(4\) 场比赛,考虑直接状压有没有打过这场比赛为一个二进制数。问题转化有为若干个二进制数,如果两个数无交就可以把它们并起来,求最后最少剩几个数。按照 popcount 从大到小枚举目标状态和使用的状态。证明 popcount 越小说明适应性越强越灵活,\(3\) 的只能匹配 \(1\) 的,\(2\) 的可以两两配对,也可以匹配 \(1\) 的,\(1\) 的就可以随便配了。直接五重循环暴力枚举拼合状态,复杂度 \(\mathcal O(n + m^5)\)

B-正在打模拟赛

特判掉 \(0\)\(1\) 的情况,显然 \(k = 0\) 的时候答案为 \(0\)\(k = 1\) 的时候只能选一个菊花,所以把每个边的边权加到两个端点上,最大的就是答案。

\(k > 1\) 是树形 DP,\(f_{i,0/1/2}\) 表示当前节点 \(i\) 只考虑自己和子树:\(0\) 表示这些节点全部选择不超过 \(k\)\(1\) 表示有一个选边超过 \(k\) 的节点在子树中,\(2\) 表示子树中没有不合法的节点但是当前节点选择超过 \(k\) 个。转移的过程是贪心的。首先 \(f_{u,2}\) 是好转移的,随便选,但是转移过来的点必须合法,所以 \(f_{u,2} = \sum_{v \in son_u} f_{v,0}\)。接下来当前节点全部选择不超过 \(k\),那么 \(f_{u,0}\) 是由若干个 \(f_{v,0}\) 的和转移而来,因此一定是贪心的选前 \(k\) 大的 \(f_{v,0}\)\(f_{u,1}\) 则是在 \(f_{u,0}\) 的基础上拿一个 \(f_{v,1/2}\) 替换掉,考虑直接枚举这个儿子是谁,如果选择的 \(f_{v,1/2}\)\(f_{v,0}\) 在前 \(k\) 大中,那么一定是去掉 \(f_{v,0}\) 后再选第 \(k + 1\) 大的 \(f_{v,0}\);否则是怡然选前 \(k\) 大的 \(f_{v,0}\),再拼一个不在其中的最大的 \(f_{v,1/2}\)。在一遍 dfs 做树形 DP 的过程中需要大根堆来辅助贪心转移,于是复杂度 \(\mathcal O(n \log n)\)

C-遗憾离场

先刻画问题,给定一个总面积 \(S\) 和总周长 \(C\),问 \(s \in [1,S],c \in [1,C]\) 的数对 \((s,c)\) 能不能由若干个矩形凑出来。把所有“竖着”的矩形“放倒”,就能把矩形的宽限制在 \(\sqrt{N}\) 级别。注意到两个矩形 \((h_1,w),(h_2,w)\) 可以等价为 \((h_1 + h_2 - 1,w),(1,w)\) 的形式。那么把刚才的每一行都合并,每次合并出来的长为 \(1\) 的矩形放在一起,然后把他们视作一些宽为 \(1\) 的矩形,然后对这些矩形再次化简,这样就把任意一种情况化简成了【若干个宽各不相同的矩形】+【任意多个 \((1,1)\)】的情况。考虑对于一些 \(4s-c\) 相同的数对,可以通过增加/减少 \((1,1)\) 的方式进行转化。因此我们只要对于每一个 \(4s-c\) 的取值,计算出可以由矩形拼出的最小的 \(c\) 是多少即可。为了节省时间,这里可以将 \(C\leftarrow \frac{C}{2}\) . 然后式子改成 \(2s-c\)。DP的时候,设计状态 \(f[i]\) 表示 \(4s-c = i\) 的所有合法数对中,最小的 \(c\) 是多少。转移时,每次多考虑一种矩形的宽 \(w\),方程形如:

\[f[i] = \min_{h=0}^{\lfloor\frac{i+2w}{4w-2}\rfloor}f[i-4hw+2h+2w] + 2h+2w \]

\[f[i] = \min_{h=0}^{\lfloor\frac{i+2w}{4w-2}\rfloor}[(2-4w)h+2w+i]+2h+2w \]

观察到决策集合是一个一次函数的形式,以 \(4w-2\) 为周期出现重叠,而每次出现重叠相当于在一个已有的集合里面添加一个新元素。所以对于每一个决策集合,动态维护它里面的最小值就可以轻松做到 \(O(n)\) 转移了。而一共有 \(O(\sqrt{n})\)\(w\) 需要枚举,所以复杂度是 \(O(n\sqrt{n})\)

D-正在重测

Day5

A-于是我栽种玫瑰

B-只因为后面的一切已早早被确定下来

C-Deliver Me

先强制钦定 \(a < b\)\(x < y\)。添加操作转化成二维平面上出现 \((a,b)\) 这个点,询问操作转化为询问平面上所有点的 \(\min(|a - b|,|a - x| + |b - y|)\)。维护两个二维前缀和:\(a\) 一维的前缀和,即每一列上点的个数;每个 \(a\)\(b\) 的前缀和。修改直接暴力后缀加,查询巨大分类讨论,令 \(d = \lfloor \dfrac{x + y}{2} \rfloor\),分成 \(a\)\([1,x],(x,d],(d,n]\) 三种情况。复杂度 \(\mathcal O(qn)\),可以二维线段树或树状数组做到 \(\mathcal O(q \log^2 n)\),常数很大,且这个范围下 \(n\)\(\log^2 n\) 差异并不显著,所以实现不精细甚至不如前者。

D-分道扬镳

Day6

A-嗯鸥哀劈(noip)

暴力 DP。首先答案上界是 \(4\)。考虑只有前三种操作,根据当前一位是什么字符都是好维护转移的。如果加上第四种操作,有价值的只有 niop 可以节省操作次数,所以在维护前三种操作得到 niop 的最小次数,然后加 \(1\) 就是使用操作 \(4\) 来得到 noip 的最小次数,两者取较小的即可。容易做到 \(\mathcal O(n)\)

B-讴不死塔扣(obstacle)

行走一定形如先往右再往下或先往下再往右,于是找出每一行/列第一个障碍。考虑先按照行做,能加就加,然后在按列做,减去重复计算的部分。树状数组简单维护即可。如果再开大值域就是做一个离散化,复刻 NOI2023 D1T1 了。

C-钙绿(probability)

D-锐特(rate)

Day7

A-仙客来

AT_arc066_E

\(a - (b - (c - (d - e) + f) + g) = a - (b - c) - (d - (e + f) + g)\),所以括号层数一定不超过 \(2\)。那么可以 \(f_{i,0/1/2}\) 表示当前考虑到第 \(i\) 个位置,套了多少层括号的最大答案,直接 \(\mathcal O(n)\) 讨论转移即可。

另一种贪心的解法是观察性质。注意到括号一定加在减号的后头。假设当前放置了一个左括号,那么右边紧邻的一段加好都将变成减号,在它右边的第一个减号之后的所有数都可以通过加括号的方式取到绝对值。所以要做的就是枚举第一个括号用在什么地方,这个可以通过前缀和和前缀绝对值和简单做到 \(\mathcal O(n)\) 维护。

B-白兰花

CF1473E

将式子转化成一条边免费,一条边花费双倍距离,能够发现实质上做的就是找这种限制下 \(1\) 到每个节点的最短路。记 \(dis_{i,0/1,0/1}\) 表示当前在节点 \(i\),是否用过免费边,是否用过双倍距离边的最短路是多少,那么答案就是 \(dis_{i,1,1}\)。直接分类讨论跑 dijkstra 即可。需要注意的是对于一条边它可以同时即是免费边又是双倍距离边,这样就是正常的距离。可能这也是一种分层图的变式,复杂度 \(\mathcal O(m \log n)\),应该有一个 \(4\) 的常数。

C-月见草

\(a_i\) 的限制使得不大好设计状态成形如 \(f_{i,j}\) 表示前 \(i\) 个人分成多少组的方案。考虑从值域上入手,记 \(c_i\) 表示 \(a = i\) 的数量。按照当前已经建设的组的大小从大向小考虑,设 \(f_{i,j}\) 表示当前建立了所有 \(size \geq i\) 的组,还有 \(j\)\(a \geq i\) 的人没有加入组。转移 \(f_i \to f_{i - 1}\) 的时候考虑加入所有 \(a = i - 1\) 的人后总共有多少人,然后枚举当前设立多少个大小为 \(i - 1\) 的组,需要用组合数预处理出将 \(i\) 个人分为 \(j\) 个组的方案数。注意到组数是 \(\dfrac{j}{i}\) 量级,所以复杂度 \(\mathcal O(n^2 \log n)\)

D-茉莉花

Day8

A-串

子序列自动机。如果 \(t\) 中有 \(s\) 没有的字符,那么无解,否则一定有解。记录下 \(s\) 串中每个位置后面每种字符第一次出现的位置,如果没有出现则连到该字符在串中第一次出现的位置。然后维护一个指针在,遍历 \(t\) 的同时表示当前在 \(s\) 的什么位置,模拟着往后跳即可,当前往的位置不在当前的位置之后,说明要新接一个 \(s\) 串了,累加答案。容易做到 \(\mathcal O(|s| + |t|)\)

B-最大权独立集问题

C-喵了个喵

D-过河卒

Day9

A-出游

依然是对于当前的决策集合贪心选取,直接跑 dijkstra,在转移部分多判断一下时刻通过的限制,直到某一时刻才能通过即可。

B-网格

考虑维护一个右下角的一个矩形,从右下往左上角填,每次加入一行和一列。对于固定的 \(i\) 来说,一定是优先填 \(|i - j|\) 大的 \(j\),因为如果 \(i\) 持续变小,那么同一个 \(j\) 越往后只会导致 \(|i - j|\) 越来越大,所以趁早贪心的填掉。用一个队列维护当前还有哪些行或列没有填完,每次加入新的行和列后就尽可能把之前没有填掉的位置填完。

官 sol 好厉害!问题等价于有 \(n\) 堆石子,第 \(i\) 堆有 \(R_i\) 个石子,每次将一堆中的一个石子向左或右移动一个单位格,问变成 \(C_i\) 的最小操作次数,直接贪心,答案是 \(R_i\) 的前缀和减去 \(C_i\) 的前缀和的绝对值之和。

C-括号

\(T = 1\) 的情况答案为 \(C_n \times k^n\),其中 \(C\) 是卡特兰数。

\(T = 2\) 的情况有点过分了,直接套官 sol 了。考虑一个 \(\mathcal O(n^2)\) 的 DP,\(f_n\) 表示\(f_n\) 表示不可切分的括号序列个数,\(g_n\) 表示括号序列个数。则有转移方程 \(f_n=2k g(n-1)-\sum_{i=1}^{n-1}\frac{f_i g_{n-i}}{2k},g_n=\sum_{i=1}^nf_i g_{n-i}\)。考虑组合意义会稍微有点绕,如果不想动脑子可以直接用 GF 暴力推:\(F=1+2kxG-\frac{1}{2k}(F-1)(G-1),G=\frac{1}{2-F}\)。可以解出 \(G=\frac{k\sqrt{1-(8k-4)x}+1-k}{1-4k^2x}\),显然用 ODE 的方法可以 \(O(n)\) 递推出 \(\sqrt{1-(8k-4)x}\) 的系数,从而获取 \(G\) 的系数。

D-生成树

答案是每个节点找到小于 \(n\) 最大的和它互质的数连边。显然这些数不会和 \(n\) 差的太多,所以倒着枚举这些数字有什么贡献,然后再用他们的因子做容斥,这样就很神秘的过了。

Day10

A-奇观

B-铁路

C-光纤

先求出凸包,

D-权值

Day11

A-商品

显然区间肯定越大越好,因此 \(r = l + d\)。将一对 \(|a_i - a_{i + 1}|\) 视为 \((min(a_i,a_{i + 1}),max(a_i,a_{i + 1})]\) 区间 \(+1\),并将得到的数组记为 \(s\)。枚举序列中出现过的数作为左端点或者右端点,假如当前框定了值域上的一段区间 \([l,r]\),那么要找的最大的 \(\sum_{i = l + 1}^{i} s_{i}\)。可以离散化后差分或者动态开点线段树实现,复杂度 \(\mathcal O(n \log n)\) 或者 \(\mathcal O(n \log V)\),后者有点危险。

B-价值

树形 DP,记 \(f_{i,0/1,0/1,0/1}\) 表示以 \(i\) 为根的子树中,\(i\) 是否匹配,\(i\) 最小的叶子是否匹配,\(i\) 最大的叶子是否匹配。需要额外注意全局编号最小和最大的两个叶子间的转移情况。复杂度 \(\mathcal O(n)\)

C-货币

相当于在 \((1,i) \to (1,i + 1)\)\((2,i) \to (2,i + 1)\) 中选择一个,如果 \(i\)\(i + 1\) 两个选择了不同的行需要额外付出 \((1,i + 1) \to (2,i + 1)\) 的代价。非常典型的分组模型,对于 \(m\) 个特殊限制,和上述限制的后者一样建边,直接跑最小割即可。

D-资本

poly,咕了。

Day12

A

如果存在一个位置 \(i\) 出现 \(|a_i - a_{i + 1}| > m\),且假设 \(a_i\) 大,那么就只能将 \(a_{i+1}\) 改成 \(a_i - m\)。反复重复这个过程直至整个序列都合法。通过观察可知将整个序列正序 check 一遍再倒序 check 一遍并更新 \(a\) 的值就可以使序列符合条件,复杂度 \(\mathcal O(n)\)

B

有解的限制非常紧,因为一堆数乘起来还要小于 \(10^9\),因此实际上 \(a_i > 2\)\(i\) 不能超过 \(\log_2 b_n\) 个。如果出现了 \(b_i > b_{i + 1}\),那么一定是修改了和 \(1\) 相邻的一个加号。直接记搜就可以了,代码实现比较困难。

C

D

poly,咕了。

Day13

A-几何

B-分析

C-代数

D-组合

Day14

A-median

B-travel

C-game

D-counter

Day15

A-原来如此

看守,一/二/三/四维空间最大点对曼哈顿距离。对于点对 \((i,j)\) 的一维属性 \(x\),对距离的贡献要么为 \(x_i - x_j\),要么为 \(x_j - x_i\),直接分 \(2^k\) 种组合情况分讨即可,复杂度 \(\mathcal O(n 2^k)\)

B-迷茫

C-聪明

D-逆转

Day16

A-挤压

B-工地难题

C-星空遗迹

D-纽带

Day17

A-喜剧的迷人之处在于

B-镜中的野兽

C-我愿相信由你所描述的童话

D-Baby Doll

Day18

A-不相邻集合

考虑从值域入手,观察得出值域上一段连续(意味着重复出现的数只算一次)的长度为 \(L\) 的区间可以取到的数的个数为 \(\lceil \dfrac{L}{2} \rceil\)。用并查集维护值域连续段情况即可,每次加入一个 \(a_i\) 检查是否存在 \(a_i - 1\)\(a_i + 1\) 并合并,复杂度 \(\mathcal O(n \alpha(n))\)

B-线段树

C-魔法师

D-园艺

关路灯功率全为 \(1\),然后 \(n\) 开到了 \(2 \times 10^6\),很厉害的题。首先依然是有经典区间 DP,\(f_{l,r,0/1}\) 表示当前完成了 \([l,r]\) 区间的工作,目前在区间的左/右端点。这样是 \(\mathcal O(n^2)\) 的,而且基本没有什么前途了。

Day19

A-拓扑排序

B-4.2

C-基因编辑

D-喵了个喵114514

Day20

A-编辑距离

B-最大区间

C-模拟退火

D-多点求值

posted @ 2023-10-10 19:01  LgxTpre  阅读(307)  评论(0编辑  收藏  举报