正睿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) $ 。