校 长 者 , 真 神 人 也 , 左 马 桶 , 右 永 神 , 会 执 利 笔 破 邪 炁 , 何 人 当 之 ? The principal is really a god with a closestool on the left and Yongshen on the right holding a sharp pen to pierce the truth Who can resist him? 校 長 は 本 当 に 神 で あ り 、 左 側 に ト イ レ 、 右 側 に ヨ ン シ ェ ン が あ り 鋭 い ペ ン を 持 っ て 真 実 を 突 き 刺 し て い る 。 誰 が 彼 に 抵 抗 で き る だ ろ う か ? Le principal est vraiment un dieu avec des toilettes à gauche et Yongshen à droite tenant un stylo pointu pour percer la v é rit é Qui peut lui r é sister ? Der Direktor ist wirklich ein Gott mit einer Toilette links und Yongshen rechts der einen spitzen Stift h ä lt um die Wahrheit zu durchdringen. Wer kann ihm widerstehen? Principalis deus est, Yongshen a dextris cum latrina acuto stylo ad perforandum veritatem: quis resistet ei? 对 曰 : “ 无 人 , 狗 欲 当 之 , 还 请 赐 教 ! ” 校长者,真神人也,左马桶,右永神,会执利笔破邪炁,何人当之? The principal is really a god with a closestool on the left and Yongshen on the right holding a sharp pen to pierce the truth Who can resist him? 校長は本当に神であり、左側にトイレ、右側にヨンシェンがあり 鋭いペンを持って真実を突き刺している。誰が彼に抵抗できるだろうか? Le principal est vraiment un dieu avec des toilettes à gauche et Yongshen à droite tenant un stylo pointu pour percer la vérité Qui peut lui résister ? Der Direktor ist wirklich ein Gott mit einer Toilette links und Yongshen rechts der einen spitzen Stift hält um die Wahrheit zu durchdringen. Wer kann ihm widerstehen? Principalis deus est, Yongshen a dextris cum latrina acuto stylo ad perforandum veritatem: quis resistet ei? 对曰:“无人,狗欲当之,还请赐教!”
一道一道地写了......因为有点多,所以可能不是特别详细。另外,这个题解只覆盖我来得及做的,还有很多题我并没有做qwq
[DATALOST]STARS
不得不说,“锦囊” 这个比喻的确十分恰当,但是恰当有什么用,我还是差点没学懂 ,这道题的启发并不全在于 k k 很小,更重要的是 —— 状态的设计是源于我们对一个序列合法性的判断方式。
◆ 搞定判断
有没有什么方法可以很好地搞定一个序列是否是 “奇妙” 的?注意到 k ≤ 5 k ≤ 5 ,我们可以稍微暴力一点 —— 不妨将固定点 P P 的维数的顺序用 O ( k ! ) O ( k ! ) 先全部枚举出来,得到一个 { s i } { s i } ,它描述的是,我们对这个序列从左到右匹配,当某个时候我们发现当前的点 A A 在所确定的 P P 坐标之内没有和它相同的时候,我们打开 { s i } { s i } 的下一维,假设为 s j s j ,然后我们将 A A 的坐标向量 → v A v A → 的第 s j s j 维放到 → v P v P → 的 s j s j 维上。那么,一个序列是合法的,当且仅当存在一个 { s i } { s i } 使得这个序列可以被全部匹配完。
“这就好比有一个世外高人给了你一个锦囊序列,你每遇到一个无法解决的问题的时候,就打开下一个锦囊,看看那个高人给你的指点在哪一维上。如果锦囊用完了都还有问题,那就说明这个高人是假的。 ” —— 邓老师
◆ 得到 DP
我们称一个需要启用锦囊的位置为 “失配点”。上面的判断给了我们启发:我们 只需要求出对于一个起始点 i i 以及一个锦囊序列 S S 的失配点集合 P ( i , S ) P ( i , S ) ,举个例子,出门的点 i i 一定在 P P 中。
现在,我们尝试寻找 P ( i , S ) P ( i , S ) 与 P ( i + 1 , S [ 1 : ] ) P ( i + 1 , S [ 1 : ] ) 之间的联系 —— 我们先考虑 ( i + 1 , S [ 1 : ] ) ( i + 1 , S [ 1 : ] ) 的过程:从 i + 1 i + 1 开始,先启用 S [ 1 ] S [ 1 ] ,再启用 S [ 2 ] S [ 2 ] ...... 而 ( i , S ) ( i , S ) 的过程呢?出门先将 S [ 0 ] S [ 0 ] 花在了 i i 点上,然后从 i + 1 i + 1 开始,尝试用 S [ 1 : ] S [ 1 : ] 解决问题,这和 ( i + 1 , S [ 1 : ] ) ( i + 1 , S [ 1 : ] ) 十分相似!但是稍微有一些区别:( i + 1 , S [ 1 : ] ) ( i + 1 , S [ 1 : ] ) 无法解决的一些点,可能在 ( i , S ) ( i , S ) 可以通过 → v i v i → 的第 S [ 0 ] S [ 0 ] 维解决,因此,我们来一个分类讨论:
P ( i + 1 , S [ 1 : ] ) P ( i + 1 , S [ 1 : ] ) 中任何一个点都无法被 → v i ( S [ 0 ] ) v i → ( S [ 0 ] ) 解决,此时 ( i , S ) ∼ ( i + 1 , S [ 1 : ] ) ( i , S ) ∼ ( i + 1 , S [ 1 : ] ) ;
P ( i + 1 , S [ 1 : ] ) P ( i + 1 , S [ 1 : ] ) 中有一个点可以被 → v i ( S [ 0 ] ) v i → ( S [ 0 ] ) 解决,此时,我们找到那个可以被 → v i ( S [ 0 ] ) v i → ( S [ 0 ] ) 解决的点在 P ( i + 1 , S [ 1 : ] ) P ( i + 1 , S [ 1 : ] ) 中的位置,并将 S [ 0 ] S [ 0 ] 放到对应的 S [ 1 : ] S [ 1 : ] 中去,得到 T T ,此时 ( i , S ) ∼ ( i + 1 , T ) ( i , S ) ∼ ( i + 1 , T ) —— 它稍微有一点类似于,原本我们应当在 i i 就把 → v i ( S [ 0 ] ) v i → ( S [ 0 ] ) 填到 → v P v P → 中去,不过我们稍微往后延迟了一点;
此时,我们就会转移了:第一个情况的转移是朴素的,直接继承 P P 即可,对于第二种情况,考虑在 P ( i + 1 , S [ 1 : ] ) P ( i + 1 , S [ 1 : ] ) 找到第一个和 → v i v i → 在 S [ 0 ] S [ 0 ] 维相同的位置,将那个位置删去,在最开始放入 i i 作为失配点,就完成了转移。
[PA 2021 Round1 A]Od Deski Do Deski
和上一道题相似的思路,我们先考虑判断一个序列是否合法:定义 f ( i ) f ( i ) 为 a [ 1 : i ] a [ 1 : i ] 的合法性,不难得到转移:
f ( i ) = ⋃ 1 ≤ j < i f [ j − 1 ] ∪ [ a j = a i ] f ( i ) = ⋃ 1 ≤ j < i f [ j − 1 ] ∪ [ a j = a i ]
现在开始考虑如何统计这个题的方案,不难发现,一个点 i i 能填入的颜色种类实际上就是满足 f [ j − 1 ] = 1 f [ j − 1 ] = 1 的那些位置的颜色集合。因此,我们可以设计状态 d p ( i , j , 0 / 1 ) d p ( i , j , 0 / 1 ) 表示当前位置 i i ,合法的颜色种数有 j j ,当前序列 合法/不合法 的方案数。
[DATA LOST]GUESS
注意题目传达的意思是,我们和 Bob Bob 都不知道 y y 是多少,我们是站在最坏的角度考虑我们可能会需要多少次来猜出答案。
真的无法想到这种转化:如果 Bob Bob 问 是不是大于 x x ? Alice Alice 回答是,我们就把 [ 1 , x ] [ 1 , x ] 覆盖一遍,否则把 [ x + 1 , n ] [ x + 1 , n ] 的覆盖一遍,而如果一个数被覆盖了大于等于 2 2 次,就不可能是这个数。而 Bob Bob 胜利的情况就是只有一个数覆盖次数小于等于一次。此时,问题就转化为覆盖。这种瞎**转化谁**想得到?
注意到我们每次都是将 [ 1 , x ] [ 1 , x ] 或者 [ x , n ] [ x , n ] 覆盖次数加一,因此,覆盖次数构成的函数图像一定是一个形如 "V" 的峡谷,而峡谷两边,过高(指覆盖次数大于等于 2 2 )的部分又会被我们砍掉,因此,可能出现的情况就只有 [ 1 , 1 , ⋯ , 1 , 0 , 0 , ⋯ , 0 , 1 , 1 , ⋯ , 1 ] [ 1 , 1 , ⋯ , 1 , 0 , 0 , ⋯ , 0 , 1 , 1 , ⋯ , 1 ] ,那么,我们可以设 f ( i , j , k ) f ( i , j , k ) 表示 [ i times 1 , 1 , ⋯ , 1 , 1 , j times 0 , 0 , ⋯ , 0 , k times 1 , 1 , ⋯ , 1 , 1 ] [ 1 , 1 , ⋯ , 1 , 1 ⏞ i times , 0 , 0 , ⋯ , 0 ⏞ j times , 1 , 1 , ⋯ , 1 , 1 ⏞ k times ] 的情形还需要最少多少次询问。注意这里我们并没有再可以强调 Alice Alice 说谎的情况,因为巧妙的转化已经帮助我们解决了。朴素的 DP 复杂度是 O ( n 4 ) O ( n 4 ) 的,不过可以二分决策点,将复杂度降低至 O ( n 3 log n ) O ( n 3 log n ) ,注意到答案关于 k k 是单调的,而次数的大小在 O ( log ) O ( log ) 级别,所以我们可以把次数放进状态而将 k k 变成值。最后的复杂度就变成 O ( n 2 ) O ( n 2 ) 了。这一段我还没搞懂,找时间再看看
[PA2021 Round2 A]Poborcy Podatkowi
◆ 暴力的思路
不妨设 f ( i , j ) f ( i , j ) 表示我们在当前的子树中选择了某些长度为 4 4 的路径,同时有一条以 i i 为根,长度为 j j 的路径时的最大的和。如果我们不考虑在 i i 上吊的这条路径,转移就是在子树中找一些 f ( v k , j k ) f ( v k , j k ) 使得
j k = 1 j k = 1 与 j k = 3 j k = 3 一样多;
j k = 2 j k = 2 的数量为偶数;
求最大权值和,我们只需要在儿子中进行 DP,转移记录 d p ( Δ , 0 / 1 ) d p ( Δ , 0 / 1 ) 表示 c n t 1 − c n t 3 = Δ c n t 1 − c n t 3 = Δ ,同时 j k = 2 j k = 2 的数量为 偶数/奇数 时的最大权值和。
还有一个小问题 —— 我们如何解决 i i 上有一个长度为 j j 的链?这很好办,加一个假儿子 x x ,并且 f ( x , 4 − j ) = 0 f ( x , 4 − j ) = 0 ,而 f ( x , otherwise ) = − ∞ f ( x , otherwise ) = − ∞ 即可。
不难发现,对于某个点的复杂度是 O ( 2 max Δ ) O ( 2 max Δ ) 的,总体复杂度将会达到 O ( n 2 ) O ( n 2 ) ,这不好 😦
◆ 随机的魅力
还记得以前考过一个题,其复杂度也和 Δ Δ 有关,而当时的处理是引入随机化降低复杂度然而很多人直接卡常过掉了...... ,我们不妨故技重施,将儿子们全部都随机化一下,max Δ max Δ 就不会特别大,将其限制在 √ n n 以内,总时间复杂度就降低为 O ( n √ n ) O ( n n ) 了。不过这个期望 √ n n 我并不是特别会证= =+
我补了一个证明:关于一个期望根号的证明 .
[Snackdown 2021 Final]Queue At The Bakery
◆ 关键的性质
神 TM 注意力比较集中就可以观察到 我们可以把所谓 “排队” 想象成是将每个人分配给每个员工,直觉上讲,将所有人平均分配给每个员工,他们的总等待时间将会最小,事实上,我们也一定存在一种平均的分配方案使得总等待时间最小,而这一性质的基础是,所有顾客的服务时间正好都是 d d 秒。该结论的证明不难,然鹅我不知道如何从较 “数学” 的角度说明这个问题 。
一个教训,抓住直觉上的一些东西并对其分析,考察其合理性。
◆ 根据性质设计 DP
既然我们知晓了这个性质,那么我们就紧贴 “余数” 来对每一个员工计算其处理的顾客的总等待时间:设 f ( i , j , r ) f ( i , j , r ) 表示还剩 i i 天,前一个处理的顾客还需要 j j 时间处理完毕,当前顾客的余数为 k k ,那么就有转移:
当 k = 0 k = 0 时,接待这个顾客,其等待时长为 j j ,状态变为 f ( i − 1 , j + d − 1 , m − 1 ) f ( i − 1 , j + d − 1 , m − 1 ) ;
当 k ≠ 0 k ≠ 0 时,不用接待这个顾客,状态变为 f ( i − 1 , j − 1 , k − 1 ) f ( i − 1 , j − 1 , k − 1 ) ;
当没有来人时,编号不变,状态变为 f ( i − 1 , j − 1 , k ) f ( i − 1 , j − 1 , k ) ;
但是它的复杂度不优,因为第二维的最大值可能为达到 n d n d 级别。但是这也到了一个玄学的地方了,即我们不难发现一个东西:当 j > n j > n 之后,显然后到的人绝没有可能出现遇到 “到了就可以服务” 的情况,他们只会等到前面所有人都服务完才到他们,因此,假设此时期望有 g ( i , k ) g ( i , k ) 个人,设当前状态 j = n + t j = n + t ,那么将会有 f ( i , j , k ) = f ( i , n , k ) + ( j − n ) g ( i , k ) = f ( i , n , k ) + t ⋅ g ( i , k ) f ( i , j , k ) = f ( i , n , k ) + ( j − n ) g ( i , k ) = f ( i , n , k ) + t ⋅ g ( i , k ) ,不难看出,这是一个关于 j j 的一次函数。而出现这种情况只有可能在 d d 比较大的时候,当 d d 较小时,几乎不会出现 j > n j > n 的情况,我们只需要在 j ≤ n j ≤ n 以内做即可。
但是这样复杂度达到 O ( n 2 d ) O ( n 2 d ) ,还是不大对,我们发现,实际上并不需要将 j j 按照 n n 区分,大概在 S = 500 ∼ 1500 S = 500 ∼ 1500 的范围内即可,为什么呢?注意到 0.4 ≤ p ≤ 0.6 0.4 ≤ p ≤ 0.6 ,也就是说,d d 大概大于等于 10 10 时,后到的人遇见 “到了就可以服务” 的概率是十分小的。而函数如果不是关于 j j 线性的,那么有一个时候它会 “触底”,即 j = 0 j = 0 ,而这种概率在 j j 达到 S S 的数量级后将会小到几乎不影响精度的情况。同样,当 d < 10 d < 10 时,让 j j 这一维能够积累到 S S 的数量级以上的概率也很小,可以忽略。
于是,复杂度就变成了 O ( n S m ) O ( n S m ) ,如果 T L E T L E 了,可以考虑调整一下 S S .
这里的另一个教训 —— 讨论概率问题的时候,注意哪些情况概率小到对答案没有影响,便可以忽略它。
经本人实测,该阈值设为 S = 100 S = 100 居然都没什么影响,所以它到底是怎算的啊......
[Snackdown 2021 Final]Robbery
如果我们选择了 2 m 2 m 个物品,那么一定存在一种方案,使得划分的两组各 m m 个物品的重量差不超过 n n . 那么我们可以设计 DP 状态 f ( k , w ) f ( k , w ) 表示我们选择了 k k 个物品,总重量为 w w 的最大值,根据 k k 的奇偶性分成两种转移:
f ( k , w ) = ⎧ ⎪ ⎨ ⎪ ⎩ max n i = 1 f ( k − 1 , w − i ) + a i 2 ∤ k max n / 2 d = − n / 2 f ( k 2 , ⌊ w 2 ⌋ − d ) + f ( k 2 , ⌈ w 2 ⌉ + d ) 2 ∣ k f ( k , w ) = { max i = 1 n f ( k − 1 , w − i ) + a i 2 ∤ k max d = − n / 2 n / 2 f ( k 2 , ⌊ w 2 ⌋ − d ) + f ( k 2 , ⌈ w 2 ⌉ + d ) 2 ∣ k
最多只会有 O ( 2 log k ) O ( 2 log k ) 层,并且每层每个节点处理的复杂度为 O ( n ) O ( n ) ,而每层的状态数不会超过 O ( 5 n ) O ( 5 n ) ,最后的复杂度就是 O ( n 2 log k ) O ( n 2 log k ) .
[AGC044E]Random Pawn
只能说特别妙了,第一步都把我妙到了......设 f ( i ) f ( i ) 为位置 i i 的答案,那么有
f ( i ) = max ( f ( i − 1 ) + f ( i + 1 ) 2 − B i , A i ) f ( i ) = max ( f ( i − 1 ) + f ( i + 1 ) 2 − B i , A i )
然后就是破环为链的神奇操作:显然 f ( i ) ≤ max A i f ( i ) ≤ max A i (无论你怎么证明都可以),于是我们可以令 A 1 = A n + 1 = max A i A 1 = A n + 1 = max A i ,同时就会有 f ( 1 ) = f ( n + 1 ) = A 1 f ( 1 ) = f ( n + 1 ) = A 1 ,显然如果走到 max A i max A i 就会停止转移(因为这样是最优的),因此,我们用 A 1 = A n + 1 = max A i A 1 = A n + 1 = max A i 成功破环为链了,现在我们将这个东西转成了一个链上问题,目的是块速求出 f ( i ) f ( i ) .
接下来是转化成凸包的第二个神奇操作:观察上式,如果没有 − B i − B i 这个东西,比如设 g ( i ) = max ( g ( i − 1 ) + g ( i + 1 ) 2 , A ′ i ) g ( i ) = max ( g ( i − 1 ) + g ( i + 1 ) 2 , A i ′ ) ,那么 g ( i ) g ( i ) 就会构成一个上凸壳,现在就看我们如何构造这个 g ( i ) g ( i ) 了。
注意到我们的 B i B i 和 f ( i − 1 ) + f ( i + 1 ) 2 f ( i − 1 ) + f ( i + 1 ) 2 的部分是线性构成的,因此,我们构造的 g ( i ) g ( i ) 一定是 f ( i ) f ( i ) 与 B i B i 独立构成的,故我们可以设 g ( i ) = f ( i ) − c ( i ) g ( i ) = f ( i ) − c ( i ) ,然后带入原式:
g ( i ) + c ( i ) = max ( g ( i − 1 ) + c ( i − 1 ) + g ( i + 1 ) + c ( i + 1 ) 2 − B i , A i ) ⇒ g ( i ) = max ( g ( i − 1 ) + c ( i − 1 ) + g ( i + 1 ) + c ( i + 1 ) 2 − B i − c ( i ) , A i − c ( i ) ) g ( i ) + c ( i ) = max ( g ( i − 1 ) + c ( i − 1 ) + g ( i + 1 ) + c ( i + 1 ) 2 − B i , A i ) ⇒ g ( i ) = max ( g ( i − 1 ) + c ( i − 1 ) + g ( i + 1 ) + c ( i + 1 ) 2 − B i − c ( i ) , A i − c ( i ) )
因此,如果 c ( i − 1 ) + c ( i + 1 ) = 2 ( B i + c ( i ) ) c ( i − 1 ) + c ( i + 1 ) = 2 ( B i + c ( i ) ) ,我们就不用考虑 B i B i 的影响,转而维护一个上凸壳了。而维护这样一个上凸壳复杂度仅仅只有 O ( n ) O ( n ) .
至于这个 c ( i ) c ( i ) 怎么求,我们很容易将上式化成 c ( i + 1 ) = 2 ( B i + c ( i ) ) − c ( i − 1 ) c ( i + 1 ) = 2 ( B i + c ( i ) ) − c ( i − 1 ) 的二项递推,随便指定初值即可。复杂度也只有 O ( n ) O ( n ) .
这个题直接秀我一脸......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2021-03-27 [BZOJ3091]城市旅行