正睿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\) 的最大人数,分讨转移:

  1. $ j \ge a_i + b_i , f_{i,j} \to f_{i+1,j} $

  2. $ a_i \le j < a_i + b_i , f_{i,j} \to f_{ i,j-a_i } $

  3. $ 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 的方案数。

采用代价延后计算的思想,有四种转移:

  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} $ ,这里的贡献不好维护,到下面的转移再计算。

  2. 当前位是 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) $ 。

posted @ 2025-10-15 20:08  Abnormal123  阅读(9)  评论(0)    收藏  举报