今天也是不颓 。
所以到底是颓还是不颓?
没搞懂。
等洛谷上有题解了再去看一遍。
神 tm Adhoc。
考虑对于一个已经选好的路径,我们找到高度相差最大的两个点,显然有结论:在这俩点里转来转去肯定是比当前路径更优的。于是我们直接找到一对 ∣ h u − h v ∣ |h_u - h_v| ∣ h u − h v ∣ 最大的 u , v u,v u , v ,答案就是 ∣ h u − h v ∣ 2 \frac{|h_u - h_v|}{2} 2 ∣ h u − h v ∣
只能说我太蠢了。
自己想到了 75 % 75\% 75% ,还是挺不错的。 下次能想到 100 % 100\% 100% 就更好了。
想到之前考试有道题。设所有的数异或和为 s u m sum s u m ,当 s u m = 0 sum = 0 s u m = 0 时肯定平局。否则一定在 s u m sum s u m 的最高位决出胜负。问题转化为:有 n n n 个数,里面有奇数个 1 1 1 ,先后手轮流取,取了奇数个 1 1 1 的人获胜。
考虑分类讨论,设有 c n t cnt c n t 个 1 1 1 :
有偶数数个 0 0 0 (n n n 为奇数)
当 c n t ≡ 1 ( m o d 4 ) cnt \equiv 1 \pmod 4 c n t ≡ 1 ( mod 4 ) Alice 先取一个 1 1 1 ,之后都和 Bob 取相同的。Alice 取了奇数个 1 1 1 ,Alice 得了 MVP!!! 当 c n t ≡ 3 ( m o d 4 ) cnt \equiv 3 \pmod 4 c n t ≡ 3 ( mod 4 ) Bob 总和 Alice 取相同的,Bob 取了奇数个 1 1 1 ,Bob 得了 MVP!!! 有奇数个 0 0 0 (n n n 为偶数)
当 c n t ≡ 1 ( m o d 4 ) cnt \equiv 1 \pmod 4 c n t ≡ 1 ( mod 4 ) 同上情况 1,必胜。 当 c n t ≡ 3 ( m o d 4 ) cnt \equiv 3 \pmod 4 c n t ≡ 3 ( mod 4 ) Alice 取了 0 0 0 ,变成上面的情况 2 的后手,必胜。 唐题。
我们考虑 dp。d p i dp_i d p i 表示到 i i i 的 h 的数量(其实就是方案数啦)。考虑转移:d p i = d p i − 1 + ∑ d p j dp_i = dp_{i - 1} + \sum dp_j d p i = d p i − 1 + ∑ d p j 。其中 j j j 满足 ( j , i ] (j,i] ( j , i ] 是一个合法的括号序列。
考虑如何快速求这个 ∑ d p j \sum dp_j ∑ d p j 。我们想到记录一个 b e l i bel_i b e l i 表示将 ( 视为 1 1 1 ,) 视为 − 1 -1 − 1 的前缀和。维护一个 s u m j sum_j s u m j 表示所有 b e l i = j bel_i = j b e l i = j 的 d p i dp_i d p i 之和。但是我们发现一个问题:这个括号序列:()(),第 3 3 3 个会从第 1 1 1 个转移而来。但是很显然,)( 并不是一个合法的括号序列。我们考虑如何 ban 掉这种情况。
我们发现出现这种情况当且仅当有 k ∈ ( j , i ] k \in (j,i] k ∈ ( j , i ] 满足 b e l k < b e l i bel_k < bel_i b e l k < b e l i 。我们考虑开一颗线段树。下标为 i i i 的地方维护 b e l i bel_i b e l i 出现的最后一个地方。对于每个 b e l bel b e l 开一个队列。在线段树上查询 l s t lst l s t 表示 [ 1 , b e l i − 1 ] [1,bel_i - 1] [ 1 , b e l i − 1 ] 的区间最小值,把队列里在 l s t lst l s t 之前的全扔出去,并从 s u m b e l i sum_{bel_i} s u m b e l i 中减去。然后转移 d p i = d p i − 1 + s u m b e l i dp_i = dp_{i - 1} + sum_{bel_i} d p i = d p i − 1 + s u m b e l i 。然后更新线段树,将 i i i 压进队列并将 s u m b e l i sum_{bel_i} s u m b e l i 加上 d p i dp_i d p i 。
最后的答案就是 d p n dp_n d p n 。
还是 赛格门特吹 好用。
听 dpfs 讲的。
考虑 dp,设 d p i dp_i d p i 表示以 i i i 结尾,满足 k k k 连续的最小代价。考虑转移:
d p i = min { d p i − 1 + w i 直接删掉 i d p j − 1 + s u m w i − s u m w j − 1 + s u m c i − s u m c j + w j 不删 i dp_i = \min\begin{cases} dp_{i - 1} + w_i & \text{直接删掉 } i \\ dp_{j - 1} + sumw_i - sumw_{j - 1} + sumc_i - sumc_j + w_j & \text{不删 } i \end{cases} d p i = min { d p i − 1 + w i d p j − 1 + s u m w i − s u m w j − 1 + s u m c i − s u m c j + w j 直接删掉 i 不删 i 其中 s u m w i sumw_i s u m w i 表示 w w w 的前缀和。s u m c i sumc_i s u m c i 表示与 i i i 颜色相同的前缀和。第二个方程具体来说就是:删掉 [ j , i ] [j,i] [ j , i ] 之间的所有数,但是同色的不能删,于是把它加回来。而我们不知道 j j j 的相同颜色的前驱是啥,于是直接减掉 s u m c j − w j sumc_j - w_j s u m c j − w j 。j j j 要满足 [ j , i ] [j,i] [ j , i ] 之间至少有 k k k 个同颜色的。
考虑优化。对于每个颜色开一个 m i n min min 数组表示 d p j − s u m w j − 1 − s u m c j + w j dp_j - sumw_{j - 1} - sumc_j + w_j d p j − s u m w j − 1 − s u m c j + w j 的最小值。又对于每个颜色开一个队列。当队列长度等于 k − 1 k - 1 k − 1 时,就把对头取出,更新 m i n min min 数组。然后转移 d p i = min { d p i − 1 + w i , m i n c i + s u m w i + s u m c i } dp_i = \min\{dp_{i - 1} + w_i,min_{c_i} + sumw_i + sumc_i\} d p i = min { d p i − 1 + w i , mi n c i + s u m w i + s u m c i } 。转移完了扔进队列。
后日谈 明天的模拟赛和重庆八中联考。又可以丢 CW 的脸了。
每次一看到这个高达 16.7 % \color{#ff0000}16.7\% 16.7% 的得分率我就头大。明明打的对的题,总是因为一些莫名其妙的愿因挂分。要么是实现太优秀,常数爆炸,要么是没注意细节。
There’s no time left.
日记 周一 4月 07 2025 1045 字 · 4 分钟