正睿noip二十联测
正睿noip二十联测
day1
$ 100 + 0 + 0 + 30 $ ,菜完了。
宝宝会算术
真宝宝题,二进制拆分一下,简单分析一下就过了。
宝宝玩游戏
躺尸大模拟。一开始想的是一个类似于插入排序的方法,需要在环上转圈,难写到爆炸;另一种做法是像冒泡排序一样每次交换相邻两个,相对好写(还是一坨)。懒得改了。
宝宝拼字母
一个显然的事实是 \(A\) 和 \(B\) 相似(不妨认为 $ |A| \le |B| $ ),等价于 $ |A| + K \ge |B| $ 并且 $ LCP(A,B) + LCS(A,B) + K \ge |B| $ 。
对于每一种后缀分别做,在 tire 树上维护前缀,同时只有最长公共后缀才是合法贡献,把不合法的贡献斥掉就好了。
宝宝选东西
首先按照 \(b\) 对每个物品排序,设 $ f(l,r) $ 表示 $ l,r $ 之间选择恰好 \(k\) 个物品的最大价值。不难发现对于每个 \(r\) 来说 $ f(l,r) $ 符合决策单调性和四边形不等式。然后就是分治优化,用链表维护前 \(k\) 大值,复杂度可以做到 $ O(n \log n) $ 。
day2
$ 100 + 56 + 36 + 52 $
小学算术
似乎是原哦,问题就是 $ \lfloor \frac{a}{b} \times c^d \rfloor \mod c $ ,答案就是 $ \lfloor \frac{ a \times c^d \bmod (c \times b) }{b} \rfloor \bmod c $ 。
马戏表演
显然是笛卡尔树DP,容易写出转移式 $ f_i = \sum_j [ j \times (i-j+1) \le m ] \times f_j \times f_{i-j-1} \times \dbinom{i-1}{j} $ ,再把组合数拆开,是一个卷积的形式,然后注意到必然存在 $ \frac{ f_j }{ j! } = 1 $ 或 $ \frac{ f_{i-j-1} }{ (i-j+1)! } = 1 $ ,前缀和优化一下就好了。
拯救世界
首先做一个简单DP,先枚举可能的波动区间,$ [0,m] $ 到 $ [-m,0] $ ,初始的状态为0,设 $ s_i $ 是 $ a_i $ 的前缀和,转移是 $ \forall j+k+s_i \in [l,r] , f_{i+1,j+k} \gets f_{i,j} + k \times c_i $ 。
发现转移是每次和一个凸函数做卷积,可以用 set 维护闵可夫斯基和,把超出合法范围的删掉,复杂度为 $ O( nk \log n) $ 。
还可以进一步优化,固定波动区间为 $ [0,m] $ ,初始的状态是 $ [0,m] $ ,发现完全是等价的。
环上游戏
咕咕咕~
day3
$ 60 + 30 + 30 + 0 $ ,感觉垃圾场。
哈基米哟南北绿豆
第一反应是,因为可以使用一个多项式表示,所以平凡的情况都是有解的,但事实上并非如此,因为不能出现分数。注意到给定的运算中没有除法和位移,所以最后的结果只能从二进制下的低位影响到高位。
结论是枚举二进制下前 \(k\) 位,若存在 $ x_i = x_j $ 但 $ y_i \neq y_j $ ,则无解,否则必然有解。
阿西噶纳哈呀鲁
垃圾题。
注意到 \(a\) 的范围很小,直接 $ O( n^2 V^2 ) $ DP。
赛事不初始化挂没了。
欧马吉利叮咚鸡
推式子题。
我要玩原神,不改这玩意了。
叮咚叮咚哈基米
大难题,不会。
先考虑 $ a_i \le 0 $ 的情况,显然最后 $ x_i $ 要么取 \(0\) ,要么所有 $ f_i'(x) $ 全都相同(设为 \(D\) ),并且 \(x_i\) 取 \(0\) 的 $ f_i'(0) \le D $ 。
假设 $ t_i $ 是定义 $ f_i(x) $ 在合理情况下能达到的最大值所需的最小 \(x\)(非负)。反证一发:设有两个 $ a > 0 $ 的函数 $ f_i( x ) , f_j( x ) $ ,最优解都满足 \(x \notin \{ 0,t \}\) ,那么 $ g(x) = f_i(x) + f_j(x_i + x_j - x) $ 是一个开口向上的二次函数,一定在定义域端点取到极值,与 \(x \notin \{ 0,t \}\) 矛盾。
总结一下,就是在 \(a\) 大于 0 的函数中,至多有一个满足 \(x_i \notin \{ 0,t \}\) 。由于这样的函数只有 $ n' \le 15 $ 个,直接 $ O( 2^{n'} n' ) $ 枚举。
然后变成了一个 $ a>0 $ 的二次函数和很多 $ a \le 0 $ 的函数求最值,再然后不会了。
day4
$ 100 + 0 + 10 + 20 $ ,被 T2 彻底创飞的一集。
开心消消乐
对于每一对相同的数都需要一次操作,另外存在 ABAB 这样的子序列也会需要一次操作,树状数组维护一下。
越狱
小清新DP。
核心思想就是让所有犯人的初始位置尽可能往前放(即不存在一种移动方式使得有犯人还能前进)。
设 $ f_{i,j} $ 表示 前 \(i\) 位中,当前房间的最终犯人数量为 \(j\) 的最大人数,分讨转移:
-
$ j \ge a_i + b_i , f_{i,j} \to f_{i+1,j} $
-
$ a_i \le j < a_i + b_i , f_{i,j} \to f_{ i,j-a_i } $
-
$ j < a_i $ ,枚举 \(i+1\) 中当前人数 $ k \in [ 0,b_i ] $ ,若 $ k < b_i $ 则有 $ f_{i,j} + k \to f_{i+1,k} $ ;否则有 $ f_{i,j} + b_i \to f_{ i+1,j+b_i } $
前缀和优化一下,设 \(M = \max \{ m , a_i + b_i \}\) ,复杂度为 $ O(nM) $ 。
冒泡排序
先贺一个排序网络的经典结论:排列 \(a\) 能在 \(k\) 轮双向冒泡排序内被排序当且仅当对于任意 $ 1 \le x \le n $ ,若将 \(a\) 中 $ \le x $ 的元素看作 \(0\) ,将 \(a\) 中 $ >x $ 的元素看作 \(1\) ,则新序列能被排序网络排序。
将排列抽象成 01 序列,进行 \(k\) 轮双向冒泡,手模出来是删掉序列前缀 0 和后缀 1 ,记 0 和 1 的连续段长度为 $ p_1 , \dots , p_m $ 和 $ q_1 , \dots , q_m $ 。每次相当于给 $ p_1 $ 和 $ q_m $ 减一,判断条件是不存在第 $ k+1 $ 个 1 或在这之后至多有 \(k\) 个 0 。设当前的元素是 \(x\) ,则序列中有 $ n-x $ 个 1 ,惊人地发现原来的判断条件等价于前 \(x\) 个元素中有至多 \(k\) 个 1 。
设 $ f_{i,j} $ 表示已经插入 $ n-i+1 $ 到 \(n\) 为 1 ,前 $ n-i $ 个元素中恰有 \(j\) 个 1 的方案数。
采用代价延后计算的思想,有四种转移:
-
当前位是 0
若 $ n-i-1 $ 插入不在前 $ n-i-1 $ 个元素中,则有 $ f_{i,j} \times (j+1) \to f_{i+1,j} $
否则,$ f_{i,j} \to f_{i+1,j+1} $ ,这里的贡献不好维护,到下面的转移再计算。
-
当前位是 1
若 $ n-i-1 $ 插入不在前 $ n-i-1 $ 个元素中,则有 $ f_{i,j} \times j^2 \to f_{i+1,j-1} $
否则,$ f_{i,j} \times j \to f_{i+1,j} $
复杂度 $ O(NK) $ 。
黑白棋
时间倒流,改为删除棋子。
枚举第一个被删除的连续的的最后一个棋子颜色,设其为 \(c\) ,反色为 $ c' $ ,则其余所有连续段(包括前一个和后一个)在该棋子被删除时为 $ c'\dots c' $ 。
后面懒得写了,直接上结论:存在至多一个连续段(不含其左右)只含 \(c\) 子序列,至多一个连续段(含左右)只含 $ c'c' $ 子序列,其余连续段(含左右)只含 $ c'cc' $ 。大力DP加前缀和优化即可做到 $ O(n) $ 。
day5
$ 85 + 100 + 10 + 10 $ ,小挂不算挂。
T1 魔法试剂
注意到集合 \(X\) 元素个数一定是 $ O( \log V ) $ 的,枚举 \(X\) 中元素之和,可能的值很少,然后暴力判断有解就行。
下界开小是会挂分的
T2 称重
直觉上就是并查集维护数量关系。具体来说开 $ O( \log V ) $ 个带权并查集, $ -1 $ 的情况需要特判。
T3 编码
直觉上就是哈夫曼树相关,被初赛知识点创飞了。
先思考 $ A = B $ 的情况,普通哈夫曼树模板,就是合并石子。
对于 $ A \neq B $ 的情况,相当于是一个特殊的哈夫曼树,每个节点两条边长度分别是 $ A,B $ 。一棵哈夫曼树的最小代价就是所有叶子结点的深度和每种编码的数量倒序匹配。
再考虑对着节点深度DP,当前的一个节点可能有两种情况:成为一个叶子,计算贡献;或者分出左右儿子,进入下一层。
对每一层分别做就好了。
T4 翻转函数
魔改版马拉车。(APJ讲过)
修改一下回文的定义:存在一个映射使得序列可翻转就称为回文。
与普通的马拉车最大区别在于:如果当前中心的对称点的最大回文串超出当前回文串范围,不能直接继承贡献,做法是把对称点的回文区间缩小。需要维护相同颜色的前驱后继,用于快速修改贡献。
现在我们证明上述做法复杂度正确性:
设当前回文串的回文中心是 $ mid $ ,回文半径是 $ R $ ,当前中心是 \(x\) ,它的对称点是 \(y\) ,\(y\) 的回文半径为 \(r\) ,那么这次区间缩小的代价为 $ mid - R - y + r $ ,显然有 $ y + r \le mid + R $ ,那么可以得到 $ mid - R - y + r \le 2 ( mid - y ) $ 。这样均摊时间复杂度就是 $ O(n) $ 的。值得注意的是,上述复杂度分析要求当区间右端点相同时,当前回文串的回文中心去更大的那个,否则复杂度是假的。
day6
$ 100 + 72 + 35 + 20 $ ,小挂不算挂。
T1 列队
将一定数量的负值交替排列,使得他们没有贡献。不好玩。
T2 子序列
一个 $ O(n^3) $ 的暴力是显然的,然后注意到每个点的状态只有最大颜色和次大颜色可能对后面的转移有贡献,可以借此优化到 $ O(n^2) $ 。
然后上经典结论。 注意到一个事实是相邻两个被选中的数字之间颜色数不超过 4 ,因为如果有更多,一定可以再插入一个,保留最大的几种颜色,转移即可。复杂度 $ O(n) $ 。
T3 骑士
一个经典的 trick 是按照 $ \frac{d}{2} $ 分组,较小的一组两两之间一定没有贡献,另一组两两之间一定有贡献。将较大的一组(降序排序)压进状态,较小的一组(升序排序)用于决策。假设当前较大的一组枚举到第 \(i\) 个,设两个集合大于 $ \frac{d}{2} $ 的数字数量是 $ x,y $ ,那么此时把 $ [ d-a_i , d-a_{i+1} ) $ 的数字加入集合,贡献分别是 $ x,y $ ,然后转移显然。
T4 文本编辑
大聪明题。
操作一定形如先执行二操作映射,再一操作微调。其中二操作的映射关系启示我们建图之后是一个基环树森林。
手玩一下就会发现:树和基环树代价就是边权之和,但是纯环需要借助一个其他节点,代价多一个 \(k\) 。
尝试最小化这个代价。
我们先对于每个节点贪心选边,如果连成纯环,似乎就暴毙了。
观察到这样一个结论:最优图中的纯环的边一定在贪心图中存在,否则一定不优。对贪心图中的环(不包括自环)状压,最多只有 13 个。还需要特判只有纯环(无解)和只有自环的情况,复杂度是 $ O( 2^{ \frac{ \Sigma }{ 2 } } \Sigma ^ 2 ) $ 。
day7
$ 100 + 100 + 0 + 25 $
T1 划分字符串
诈骗题,只有 10000000 这样的才不是好串。
T2 记忆碎片
显然答案是单调的,并且答案规模不超过 $ O( \sqrt {n} ) $ ,枚举两种整理方式的操作次数,贪心计算。
T3 三分图计数
对于判断一个图是不是三分图是没有前途的,不如在排列上考虑问题。一个排列不是三分图,相当于最长下降子序列长度超过 3 。按照贪心求 LDS 的方法DP。设 $ f_{x,y,z} $ 表示当前 LDS 元素为 $ i,j,k $ ,满足还没确定的数字中 $ [i+1,n] $ 有 \(x\) 个, $ [j+1,i-1] $ 有 \(y\) 个,$ [k+1,j-1] $ 有 \(z\) 个。先预处理再试填法。
复杂度 $ O( n^3 + T n^2 ) $ 。
T4 登山计划
数据结构可爱捏。
不妨先考虑弱化问题 $ L=1 , R=n $ 。
经典序列分治,设当前分治区间 $ l,r $ ,中点是 $ mid $ 。对左侧做后缀 min ,对右侧做前缀 min ,枚举子区间长度 \(k\) 。当区间左端点为 \(i\) 时,答案即为 \(| \min \{ sa_i , sa_{ i+k-1 } \} - \min \{ sb_i , sb_{ i+k-1 } \} |\) 。其中 $ sa_i $ 随 \(i\) 单增, $ sa_{ i+k-1 } $ 随 \(i\) 单降, $ sb $ 类似。二分临界点记为 $ pa,pb $ 。
对于 \(i \le \min \{ pa , pb \}\) ,答案是 $ | sa_i - sb_i | $ ,可以ST表维护。
对于 \(i > \max\{ pa , pb \}\) ,答案是 $ | sa_{ i+k-1 } - sb_{ i+k-1 } | $ 同理。
若 $ pa < pb $ ,则中间的部分答案是 $ | sa_{ i+k-1 } - sb_i | $ ,同样可以二分。反之亦然。
再推广到一般的情况,类似于线段树上区间查询。复杂度 $ O( ( n+q ) \log ^2 n ) $ 。通过一些技巧可以做到 $ O( n \log ^2 n + q \log n ) $ 甚至 $ O( ( n+q ) \log n ) $ 。
day8
$ 100 + 70 + 35 + 10 $ ,卡常真是太坏了。
T1 鱼人
直接在逆排列上考虑,如果存在一条人的边跨度超过 2 ,就无法必胜。
T2 前期攻势凶猛
不良心出题人,爱卡常。
一个事实是 $ (a,b) $ 能由 $ (x,y) $ 变换到,必然有 $ \gcd(x,y) = \gcd(a,b) $ 。
类似于欧几里得算法流程,可以把一个向量拆为 $ O( \log V ) $ 个某一序列上的一段等差数列下标做加法。
值域很大,容易想到使用 map ,然后会被卡常。很不好。
T3 机械
感觉不太难。
对于 $ [ 1,n-1 ] $ 都需要恰好一个比它大的父亲,对于 $ [ 2,n ] $ 都需要恰好一个比它小的父亲。是一个类似于二分图匹配的形式。
建 $ 2 n - 2 $ 个节点,原问题相当于给每条边定向,使得每个节点都有出度。显然每个基环树都有 2 的贡献,答案形如 $ 2^k $ 。
T4 则以后期见长
维护已有元素十分困难,考虑维护还不存在的元素。
对于一个元素 \(x\) 来说,在线段树上存在这样一类点:其祖先节点与包含 \(x\) 的区间有交但不包含,其所有后代节点都不含 \(x\) 。
这样的节点数量是可控的。
给这样的节点打一个 \(x\) 标记,可以用 set 维护,并处理当前区间的最大 $ mex $ 。
同时珂朵莉树维护连续段,颜色段均摊后是 $ O( n \log ^ 2 n ) $ 。
day9
$ 100 + 100 + 100 + 0 = 300 $
T2 动态图
维护一个无向图,支持:动态加边,将一个连通块变成完全图,查询一条边是否存在。
将完全图缩点,显然可以用并查集维护。可能有点卡常。
T3 憧憬
我得了一种看见有向图就追忆过去的病。
先对原图缩点,成为一个 DAG ,$ [l,r] $ 是闭合子图等价于从 $ [l,r] $ 出发能到达的最大点是 \(r\) ,最小点是 \(l\) 。查询区间肆意做。
T4 猜数字游戏
挺困难的思维题。
维护一个集合 \(S\) ,表示当前状态下所有人都知道的不可能作为 \(a\) 的序列,初始时就是不合法序列。
假设有这样一天,$ S $ 中的一个序列与 \(a\) 只有一个位置的值不同,那么游戏就结束了。当初始时 \(S\) 为空,游戏才会不停继续下去。
每一天过后,对于 \(S\) 中的每一个序列,与之只差一位的序列都可以判定为不可能。答案就是初始时 \(S\) 中与 \(a\) 相差最少的位数,转化为求相同最多。
设 $ B_i = \sum_j^{i-1} b_j , C_i = \sum_j^{i-1} c_j $ ,设相邻两个相同的 \(a\) 下标分别是 $ i,j (i<j) $ ,那么有 $ a_j \in [ a_i + B_j - B_i , a_i + C_j - C_i ] $ ,写成不等式再移项,可以得到 $ a_i - B_i $ 单调不降, $ a_i - C_i $ 单调不升。算上下标的一维是一个三维偏序状物。
再观察一下,游戏会结束一定存在 $ b_i \le c_i $ , $ a_i - B_i $ 单调不降, $ a_i - C_i $ 单调不升,说明下标已经有序,就成了二位偏序。
day10
$ 100 + 25 + 57 + 20 = 202 $
Guiltiness
怎么连特判都能写挂。
首先每个数可以选择异或 \(X\) 和 \(Y\) ,可以先对所有数异或 \(X\) ,然后选择不变或是异或 $ X \oplus Y $ ,这样的形式更好看。
如果我们用两种形式的最小值来代表这个数,那么异或意义下的一对数是可以唯一表示的,开个桶,组合数算一下就好。
无解要特判。
Hypochondriac
一个显然的事实是如果确定了序列的前两位,那么整个序列就确定了。手模一下就会发现序列有一个长为 6 的循环节。如果得知前两位就可以快速计算贡献,是几个绝对值的形式。
几个凸函数的闵可夫斯基和还是凸函数,所以答案关于 $ h_1 , h_2 $ 是凸的。暴力二分然后树状数组优化就是 $ O( q \log^3 V ) $ 。
用分块代替树状数组平衡复杂度,可以做到 $ O( q ( \log^2 V + \sqrt{V} ) ) $
day11
$ 100 + 0 + 75 + 0 = 175 $
Jealousy
先观察一手性质,原限制相当于对于序列的每个元素,都存在一个素因子,使得该元素的次数是绝对最大值。然后双指针再上数据结构维护一下应该就对了。
Return
神秘树上高消。
day12
$ 0 + 100 + 40 + 48 = 188 $
子序列
贪心构造。一个基本的思想就是对于 \(t\) 来说,如果保证有一位匹配不上,那么无论怎么填都不会对后面有影响。
对于每个 \(s\) 维护一个位置表示能与当前的 \(t\) 匹配长度。
感觉有点 ad-hoc ,想题的时候经常在相似的地方卡住,可能是更深刻的问题导致的。
当时快 CSP 了,没怎么改题,感觉状态好差。
day13
$ 100 + 50 + 0 + 6 = 156 $
CSP 后整个人都很玉玉,连着好多天没什么精神。
匹配
对于横纵坐标之间连边,在一个连通块内,如果边数是偶数,那么一定有一个合法匹配。证明不难的。
追忆
又是 recall 。
阈值分治看来是显然的。不妨设阈值是 \(B\) ,对于 $ k \ge B $ 做一遍莫队,维护一个桶,查询暴力跳就行,复杂度上限是 $ O( \frac{n^2}{B} ) $ 。对于 $ k < B $ ,对每个 \(k\) 分别做莫队,设 $ k = i $ 的操作数量为 $ m_i $ ,总复杂度为 $ \sum_i n \sqrt{m_i} $ ,最值是 $ O( n^{ \frac{3}{2} } B^{ \frac{1}{2} } ) $ 。平衡一下,$ B = n^{ \frac{1}{3} } $ ,$ O( n^{ \frac{5}{3} } ) $ 。最后是丧心病狂的卡常环节。
day14
$ 100 + 100 + 0 + 0 = 200 $
游戏
首先注意到,如果能把原序列划分为两个和相等的集合,那么一定是后手必胜。我们猜测这个条件是充要的。证明的话考虑在一次游戏中出现的值划分为两个集合,如果后手必胜说明两个集合元素一一对应相等,交换相同元素仍然成立,感性理解一下或者反证法。
然后变成一个判定问题,可以背包做。由于多组询问的原因,上线段树(会带 $ \log $ )或猫树分治即可。
day15
$ 100 + 10 + 0 + 0 = 110 $
牛马
显然的思路是预处理 $ f_{i,j} $ 为在一侧选择了 \(i\) 个点,形成 \(j\) 个连通块的方案数。对于这部分,赛时的想法是形成了一个树形结构,可以对着这个DP,但是复杂度不允许。事实上,只要每次动态插入一个连通块就好了,维护一下前缀和,轻松 $ O(n^2) $ 预处理。
亚军
最长上升子序列和最长下降子序列一定有一个交点在 \(n\) 的位置,枚举这个数字,然后可以 $ O(n^2) $ 算贡献。进一步地,这个数字改变时,总答案的改变量非常少,可以 $ O(n) $ 维护。

浙公网安备 33010602011771号