4月做题记录
4月做题记录
✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补
- 4月做题记录
- CF1965D
- CF1965F ✡✯
- [CTS2019]氪金手游
- AGC058F ✬◈✩
- P9522 [JOISC 2022] 错误拼写 ✩
- qoj8047/The 2023 ICPC Asia East Continent Final Contest A. DFS Order 4 ✯
- ARC196 A
- ARC196 B
- ARC196 C
- ARC196 D
- CF1476F Lanterns
- CF704B ✩
- P9197 [JOI Open 2016] 摩天大楼 / Skyscraper
- [ABC241Ex] Card Deck Score ✡
- [qoj9222]3rd Ucup Stage 7 C. Price Combo ✩✡✯
- P4590 [TJOI2018] 游园会
- [qoj9220] The 3rd Universal Cup. Stage 7: Warsaw A. Bus Analysis ✬✩
- [AGC013D] Piling Up ✩
- ARC194A ✩
- ARC194E
- P10053 [CCO 2022] Bi-ing Lottery Treekets
- #10057. 网络架设(net)
- P3993 [BJOI2017] 同构 ✡✬
- CF101E
- P11762 [IAMOI R1] 走亲访友 ✩
- P11904 [NHSPC 2023] C. 与自动辅助驾驶畅游世界
- CF1503D Flip the Cards ✬✩
- P11820 [PA 2015] 健身房 / Siłownia ✩✯
- P11883 [RMI 2024] 信号 / Signals ✩
- CF1610H Squid Game ✩
- CF1322F Assigning Fares ✩
- P8334 [ZJOI2022] 深搜
嘻嘻四月一号做的放到三月做题记录里了,肯定不是忘了已经四月了,一定是愚人节彩蛋吧/se
CF1965D
还比较有趣的一道题
考虑到序列是回文的,也就意味了,除非区间\([L,R]\)的\(L\)和\(R\)恰好对称,区间\([L,R]\)都能对称到另一个区间去
也即只有\(\lceil\frac n2\rceil\)种\(sum\)会是奇数个
考虑被删掉的
- 如果删掉的是一个\([L,R]\)对称的(只要原本对应权值是奇数个就可以视作这个),此时个数是奇数的权值数量是\(\lceil\frac n2\rceil-1\)
把奇数的提出来排序,然后它们的差可以弄出一个长度为\(n-2\)的回文序列,因为有一组相邻的被压缩了
先把这个\(n-2\)的回文序列对应的所有和算出来并删去,此时就可以用剩下的最大值来确定这组压缩的具体是哪两个值了
- 如果删掉的是一个\([L,R]\)不对称的且对应权值原本是偶数个的,此时个数是奇数的权值数量是\(\lceil\frac n2\rceil+1\)
此时得到一个\(n+2\)的回文串,因为有个被拆成了俩
大概就同上,就能得出是哪两个要合并
复杂度\(O(N^2logN)\)
CF1965F ✡✯
显然\(hall\)定理,但是对于\(s\),直接取一段区间有问题(hack:三个区间,\([1,3]\),\([2,2]\),\([2,2]\))
但是注意到,对于区间\([a,b]\)和\([a,c]\)(\(b\leq c\)),显然把\([a,c]\rightarrow [a+1,c]\)不劣(把\([a,b]\rightarrow [a+1,b]\)有把\([a,b]\)弄没的风险),当然如果\(a=b=c\)此时就是删了一个\([a,a]\)
发现这样之后\(s\)就可以直接取一段区间了
复杂度\(O(NlogN)\)
[CTS2019]氪金手游
诶,糖一下,诶,糖一下,诶,糖一下
显然可以建成一棵树,变\(u\rightarrow v\)表示\(u\)要比\(v\)后出现
考虑对于一个集合\(S\),要求\(u(u\in S)\)是最早出现的那个的概率是\(\frac{w_u}{\sum_{i\in S} w_i}\)
然后上树形\(dp[i][j]\)表示子树\(i\)内\(\sum w_i=j\)的答案
如果是内向树好计算,但是肯定会存在外向边,外向边直接容斥即可
复杂度是树上背包的,\(O(N^2)\)
AGC058F ✬◈✩
因为题目给的是\(/n\),想办法给它转换成概率相关的东西
但是每次相当于是切的边,按理来说应该是\(/(n-1)\)(这里有个有趣的事实,如果是\(/(n-1)\),那么\(f(t)\)恒等于\(1\)),但我们是\(/n\),那么就想办法从边转换成点
在每条边中间插入一个边点,这样就可以用这个边点来代表边了,也即边转换成了点,但这样此时点数是\(2n-1\)的,那么我们又可以在边点下面挂\(MOD-1\)个点,那么总点数就是\(\equiv n\)的了,且因为运算在模意义下,无论乘除加减都没有影响
那么现在\(f(t)\)的组合意义就是,对\(t\)中所有点随机赋值成一个排列,要求所有边点必须权值小于与它相邻的所有点的权值的概率
那么就转换成氪金手游了
复杂度\(O(N^2)\)
一些关于氪金手游类题目的思考:
为甚么概率不是\((\frac 12)^{n-1}\)
如果只有两个数\(a,b\),让你随机顺序的放,确实是\(\frac 12\)的概率\(a\)在\(b\)前面
但你考虑到,以\(p_a<p_b<p_c\)为例,似乎按理来说,概率可以表示成\(P(p_a<p_b)\times P(p_b<p_c)\),因为显然任意两数间的大小关系是独立的,那似乎就是\(\frac12\times\frac12\)了
但事实是,概率为\(\frac1{3!}=\frac16\)
这是因为,虽然这俩事件是独立的,但你要注意到,这个\(\frac 12\)的概率的算法,是基于
被比较的两者都是随机放的条件下的,假设我们先放了\(a\)和\(b\),先有了\(\frac12\)的概率,在此条件下,对于\(b\)和\(c\),\(c\)是随机放的,但\(b\)并非随机的,它是明确了要放在\(a\)后面的,那么\(P(p_b<p_c)\)就不是\(\frac 12\)了\(c\)可以插空放,概率就是\(\frac 13\)的,也可以理解为\(c\)是集合\(\{a,b,c\}\)中放在最后面的那个,概率是\(\frac 13\)的
如果理解为后面这个,可能还有点疑问,已经保证\(p_a<p_b\),似乎只要\(c\)是集合\(\{b,c\}\)中放在最后的那个即可,概率好像也是\(\frac 12\)的
但注意到,这里\(\frac 12\)的算法依旧是基于,\(b\)和\(c\)相对于集合内外所有数都是随机放的,所以该方法也是不适用的
那我们为甚么不能求出子树\(u\)的答案后,直接向上计算一下,推给\(fa_u\),一定要整体的容斥?或者说为甚么不能只对\((u,v)\)(\(v\in son_u\))进行容斥,非得整棵树所有的一起容斥?
首先之所以要整体的一起容斥,是因为我们能计算整棵树所有边朝向一致时的答案(那些不定向的视作断掉了)
考虑如果算出\(v\)的答案,\(u=fa_v\),怎么推给\(u\)
注意到,此时,\(v\)子树内的点并不一定满足都有\(p>p_v\),即有的大于有的小于,且对于整体一起容斥时,这个大于和小于的部分是独立的(小于只会出现于被断边的子树中,即根本不在乎),而对于这里,我们的大于和小于是牵连的,且我们根本不知道\(v\)所处的具体位置,也就无法计算概率(即按照1.,我们要算出某个概率,要知道\(v\)前后的间隙分别有多少个,这里不知道,就算不了)
P9522 [JOISC 2022] 错误拼写 ✩
首先显然限制能转换成对于区间\([l,r]\),第一个\(i\in[l,r]\)满足\(s_i\neq s_l\)的要有\(s_i>s_l/s_r<s_l\)
可以发现从前往后不好弄,这样\(dp\)的过程中可能还会需要去记录这个第一个\(i\)
那么从后往前,每次只需要“覆盖”即可
这种反着进行的操作很常见啊!
设\(f[i][j]\)表示考虑了\(s_{[i,n]}\),\(s_i=j\)时,所有区间\([l,r]\)满足\(l\geq i\)都合法的方案数
直接转移就是\(O(N^2|\sum|)\)的
但考虑到,对于\(i\)的某个转移点\(k\),对于这个\(k\)的限制大概分为四类:
- 对\(k\)没有限制
- 要求第一个是\(<\)的
- 要求第一个是\(>\)的
- 两种限制都有的
显然\(k\)对应的转移状态只与这些有关,且改变是\(O(1)\)次的,\(set\)维护即可
复杂度\(O(N(\sum+logN))\)
qoj8047/The 2023 ICPC Asia East Continent Final Contest A. DFS Order 4 ✯
显然可能会存在不同的树对应同一种序列,那么考虑哪种序列是合法的
显然对于一个序列的判定方式,就是维护从根到当前点\(x\)的链,考虑新加入的点\(y\)
- 若\(y>x\),直接接到\(x\)下面
- 若\(y<x\),\(x\)一直往上跳,直到跳到\(x<y\),此时再把\(x\)弹出,加入\(y\)
那么找能构造出来的树的形态,就要求:
- \(fa[x]<x\)
- 对于\(x\)的所有儿子,从小到大排序后,第\(i\)个儿子\(son_i\)的最大的儿子\(y\),要满足\(y>son_{i+1}\)
考虑对这样的树进行计数,建出\(DAG\),先后第二条条件不好满足,考虑容斥
发现去掉第二条件或反转第二条件就能让\(DAG\)变成树,而树形\(DAG\)的分配编号的方案数是\(\frac{n!}{\prod sz_i}\)
那么可以考虑\(dp\)这个\(DAG\),\(dp[i][j]\)表示目前有\(i\)个点,\(j\)个上升边(即那个第二条件反过来),然后转移即可
------
/
------
/
---
\(j\)就是这个 /的数量,当然,每个 -------下面都挂着它对应的儿子层
复杂度\(O(N^3)\)
ARC196 A
这场场切了ABD啊,C算场切吗,当时没想起ntt,就卡了好久,没做出来,火速开了D然后切了D,感觉某种意义上,A<D<C<B啊!
显然可以转换为,钦定每个数取 +or -,只要 +/-各有\(\frac n2\)即可
那\(n\%2==0\)的就做完了
对于\(n\%2==1\)的,枚举那个没有符号的点,要求左侧有偶数个,右侧有偶数个,且每侧内的 +/-数量相同
复杂度\(O(NlogN)\)
ARC196 B
手模一下能找到一些性质,比如\(B\)类的联通块必须同一个朝向,本来想从这里入手,但是之后就没啥思路了
总之你手模的过程中,能体会到,真正应该关注的其实不是每个格子的摆放方向,而是这个格子的边的中点是否被选择了
- 对于\(A\)类,要求它上下两条二选一,左右两条二选一
- 对于\(B\)类,要求它上下两条必须同时选/同时不选,左右两条同时选/同时不选,且这两组二选一
先对\(B\)类前面那俩性质直接用缩点解决,合并了,然后对于剩下的要求,就可以连边表示二选一
显然不能有奇数边,那么其实就是一张二分图了,且显然每个联通块都有两种选发,找出联通块的数量\(C\)后,答案就是\(2^C\)
复杂度\(O(NM\alpha(NM))\)
ARC196 C
就要求不存在一个点\(x\),使得没有跨过它的向左的边,经典容斥
设\(dp[i]\)表示\(1\sim i\)的答案,设\(dp[0]=-1\),\(dp[2n]\)就是最终的答案
转移有\(dp[i]=\sum_{0\leq j<i} -dp[j]\times\frac{(w[i]-b[j])!}{(w[i]-b[i])!}\),然后可以分治+卷积
复杂度\(O(Nlog^2N)\)
ARC196 D
显然可以转换成前缀和,限制大概就变成了,两端要相同且中间都要小于/大于两端,的样子
根据\([S_i<T_i]\)分类,显然同种类型的要么除端点(即端点重叠)不交,要么被完全包含(且端点也不能重叠)
对于不同种的,假设\(S_i<T_i\),\(S_j>T_j\),那么\(S_i\neq T_j\)且\(T_i\neq S_j\)即可
显然只有这两类条件,因为只要满足它们了,考虑到现在的那些限制就处于一种,相对独立的状态了,就不会有其他限制了
找到每个\(L\)对大的\(R\)即可,复杂度\(O(NlogN)\)
CF1476F Lanterns
设\(dp[i]\)表示前\(i\)个数最多能覆盖到\([1,dp[i]]\)
转移有:
- \(dp[i]=dp[i-1]\)
- \(dp[i]=i+p[i](dp[i-1]\geq i)\)
- \(dp[i]=i-1(dp[i-1]\geq i-p[i]-1)\)
- \(dp[i]=k+p[k](\exists_j j<k<i,dp[j]\geq i-p[i]-1)\)
树状数组维护即可,复杂度\(O(NlogN)\)
CF704B ✩
这类问题的经典\(trick\),设\(f[i][j]\)表示\(1\sim i\),形成了\(j\)个块的答案
复杂度\(O(N^2)\)
P9197 [JOI Open 2016] 摩天大楼 / Skyscraper
类似于上一道题,但一般来说我们是直接把绝对值拆开,这里因为要计入状态,直接拆开很难搞,所以考虑扫那个值,然后每次加上差值\(\times\)块数-[头]-[尾]即可
复杂度\(O(N^2L)\)
[ABC241Ex] Card Deck Score ✡
这个题目相当于就是求
前半直接算,考虑后面怎么弄,这种形式的都可以这样做:
对每个\(i\)带入\(x=\frac1{a_i}\),这样就能得到\(p_i\prod_{j\neq i}(1-\frac{a_j}{a_i})=1\),得到\(p_i=\frac1{\prod_{j\neq i}(1-\frac{a_j}{a_i})}\)
那么可以\(O(N^2)\)算出\(p_i\),再把\(\frac1{1-a_ix}\)拆回成\(\sum_j(a_ix)^j\),然后再和前面合并一下就好
复杂度\(O(2^NN+N^2)\)
[qoj9222]3rd Ucup Stage 7 C. Price Combo ✩✡✯
以前做过啊
首先显然每侧从大到小排序后,也从大到小取最优
这种肯定得先找点性质了,多半会是两个点间的限制,比如必须在同侧或不同侧之类的
然后可以从\(x\)和\(y\)在异侧改成同侧的\(\Delta\)或同侧改成异侧的\(\Delta\)下手
发现若满足\(a_x>a_y\),\(b_x<b_y\),那么\(x\in A\)、\(y\in B\)一定不优
如果看做点\((a_i,b_i)\),就是说明,有一条左下到右上的斜线,斜线及其左上是\(A\)的,右下是\(B\)的
直接\(dp\)边界,复杂度是\(O(N^2)\)的
考虑用线段树枚举,外面扫描线\(a\)从大到小,线段树下标记录的\(b\),记录\(f[i][0/1][0/1]\),表示当前划分到\(b_i\),\(A\)中有偶奇个,\(B\)中有偶奇个,然后这个上方的\(A\)和右上的\(B\)的总贡献,所以把当前\(x\)的\(b_x\)的值放到\(b_x\)上,维护的时候合并一下就能查出点右下方的\(B\)的贡献和
这里折线采取能不往下走就不往下走的策略,所以转移的时候要么就平着转移,那么只会向下走到当前点\(x\)
可能会有\(a_x=a_y/b_x=b_y\)的情况,直接任意钦定个大小即可
复杂度\(O(NlogN)\)
P4590 [TJOI2018] 游园会
dp套dp板子题,感觉很久没做到过dp套dp了
考虑我们一般怎么求最长公共子序列的,是设\(f[i][j]\)表示\(s_{[1,i]}\)和\(t_{[1,j]}\)来转移的
由注意到\(f[i][j]=f[i][j-1]/f[i][j-1]+1\),所以显然\(f[i]\)后一维可以用二进制\(s\)表示
然后就这样\(dp\)了
预处理一下复杂度可以做到\(O(N2^K)\)
[qoj9220] The 3rd Universal Cup. Stage 7: Warsaw A. Bus Analysis ✬✩
很好的诠释dp套dp的题啊!
感觉dp套dp最好的解释就是,先弄出一个基础的dp(根据题目要求的答案来选),然后再根据题目的要求,对这个dp进行一些dp操作
- 解决内层\(dp\):也即在去掉一些当前不定的条件后,对于剩下部分计算答案的\(dp\)
这里就是确定了具体哪些点还存在,然后求\(f_i\)表示覆盖\(1\sim i-1\)的最小代价
- 压缩内层\(dp\):因为一般我们的内层\(dp\)的状态数比较大,无法直接压入状态,所以要考虑压缩
这里可以发现,对于\(f_i\),需要知道\(f_{[i-75+1,i-1]}\),显然这个内部的极差\(\leq 6\),肯定可以直接记录对应有效值最大的位置,但\(6\)还是太大了,又注意到贡献是\(2/6\),全都先除以一个\(2\),最后乘回来即可,那么现在内部极差\(\leq 3\),可以压入状态了
那么对于一个\(i\),只需要记录:\(f_i\),\(f_i-1\)的最大位置,\(f_i-2\)的最大位置,\(f_i-3\)的最大位置
这样状态数可以压缩到\(O(75^3N^2)\)
- 嵌套外层\(dp\)
外层其实需要考虑的就是一个点选上与否,直接沿用内层的状态即可,这样复杂度是\(O(75^3N^2)\)的
但是注意到我们只需要求出最终所有\(f_{n+1}\)的和,考虑当\(f_i=f_{i-1}+1\)时,分为两部分记录,前一部分就从\(i-1\)转移过来,后一部分其实就是方案数,那么我们就不用记录\(f_i\)具体的值了
复杂度和状态数都降为\(O(75^3N)\),可以通过,但对于这道题,还可以继续优化
- 针对此题的优化:一般的\(dp\)套\(dp\)类题,在外层是需要一步步的转移的,但这道题可以跳
考虑到记录的\(f_i-3\)只有\(+75\)这一个作用,且它在\(f_{i+1}=f_i+1\)时就会被替换掉,没太大用,于是考虑去掉这一维,那么对应的,状态就变成\(dp[i][x][y]\)(\(x\)和\(y\)分别是\(f_i-1\)和\(f_i-2\)的位置)表示\(f_{i+1}=f_i+1\)时的答案和方案数
转移的时候参考前面状态还是\(O(75^3N)\)时的转移,分为\(i\)是否存在来看
若不存在,显然\(i+1\)直接继承\(i\)的那些状态的值
若存在,原本应该是看是否需要\(+1\)然后转移,这里考虑到我们的\(dp\)的定义发生了改变,主要找到第一个\(f_i+2\)的位置的前一位,转移过去即可,过程中只需要保证\(i\)存在即可,其余的是否存在都无所谓
复杂度和状态数降为\(O(75^2N)\)
[AGC013D] Piling Up ✩
先考虑怎么check是否合法
显然这种我们就可以关心黑点的数量变化曲线,显然可以发现一组最终都可以描述为\(+1,0,-1\),其中为\(0\)的有两种方案
那么只要极差\(\leq n\)即可
由此可以设计出最显然的\(dp[i][x][y]\),表示当前最大值是\(a_i+x\),最小是\(a_i-y\)(\(a_i\)是时刻\(i\)的),这样复杂度是\(O(MN^2)\)的
显然这样做没什么出路,因为限制极差\(\leq n\),所以直接令所有值都处于\([0,n]\)的区间即可
但是这样直接做显然会算重,这里有两种解决方案:
钦定算最下面那个
那么也就是最小值为\(0\)的那些,直接\(dp[i][j][0/1]\)表示当前\(a_i=j\),是否出现过\(0\)
容斥
先就算出\(dp[i][j]\)的所有答案,然后再容斥掉\(n-1\)的答案(即只能取\(1\sim n\)的方案数)
复杂度\(O(NM)\)
ARC194A ✩
主要是有个很有趣的trick/结论
对于这种加入到末尾/弹出末尾,或者理解成括号匹配也行
最终都可以简化成相邻两个的匹配
显然你原本非相邻的操作一下就能交换成相邻的了
ARC194E
首先你显然能想到对于\(0\),可以\(X\)个\(X\)个的划分,对于\(1\),可以\(Y\)个\(Y\)个划分
如果所有\(0/1\)连续段分别都是\(\%X/\%Y\)等于\(0\)的,你就直接这样划分完然后\(check\)两个串的\(0/1\)数量是否相等即可
现在考虑对于那些\(0/1\)连续段分别\(\%X/\%Y\)不等于\(0\)的,找到它们
以\(0\)连续段为例
显然该段左右两侧的\(1\)是不能交换的,即左右两侧的\(1\)数量固定,且若它是\(s\)中第\(k\)个特殊\(0\)段,则也一定是\(t\)中第\(k\)个特殊\(0\)段
且无论\(0/1\)特殊段,在\(s\)和\(t\)中都保持同样的相对顺序
也许可能会出现,没有保持相对顺序但只看同色特殊段是合法的,的情况,这种显然不合法
复杂度\(O(N)\)
P10053 [CCO 2022] Bi-ing Lottery Treekets
真,真的蓝题吗,感觉紫吧
显然会从下往上\(dp\)吧
反正大概手模一下会发现,好像很多走法下,有值的点集都相同,特别是对于阻拦与被阻拦的点,它们完全是能够交换对应最终点的(当然前提是可达)
然后进一步的就可以发现,只用关心从子树外到子树内的点的数量
直接\(dp[i][j]\)表示子树\(i\)外有\(j\)个点进来了
复杂度\(O(N^2)\)
#10057. 网络架设(net)
懒得找原题了
显然会先想到最小生成树的基础上去操作,考虑这个过程,将边按照(权,代价)的顺序从小到大排序
考虑挨个加入边,显然如果该边对应两点当前最短路不比该边的值大,这个边一定不会加入,否则一定假如,因为显然就算加入后面权值更大的边也不会导致这两点间的最短路比该边小
复杂度\(O(N^2logN)\)
P3993 [BJOI2017] 同构 ✡✬
求最大可以转换成求补图的最小,然后显然有补图和原图的[是非平凡自同构]相同,所以现在就是求最小的非平凡自同构边数
考虑对于一个不存在非平凡自同构图,因为定义是不存在\(p_u\neq u\),一定会满足,所有联通块都是不存在非平凡自同构,所有联通块也都是非同构的
显然最好就是森林了,显然树要想是不存在非平凡自同构,就得每个点的子树都不存在同构的
trick,怎么判同构,显然一般是用树\(hash\)来判,但显然不能所有点判,注意到我们直接判重心为根是否同构即可(有俩重心就都判一下),且只要以重心为根的所有子树都不同构就能满足满足我们的条件了,这个可以考虑反证,不赘述
现在来考虑\(dp\),设\(f[n]\)表示\(n\)个点的无根树的方案,\(h[n]\)是有根树,\(g[n][m]\)是共\(n\)个点的森林,其中每个树的大小\(\leq m\)
转移有:
当\(n=266\)是,\(\sum i\times f[i]\)已经超过要求范围了
CF101E
\(O(N^2)\)的\(dp\)是显然的,但是因为要输出答案,所以空间不能\(O(N^2)\)
考虑分治,或者说\(BSGS\)就可以做到空间\(O(N)\)
P11762 [IAMOI R1] 走亲访友 ✩
首先\(dfs\)树,现在去掉那些返祖边
这个\(n+m\)大概是在提醒我们,\(m\)是所有边走一次,\((n-1)+1\)是每个点和父亲的树边还能再走一次
考虑把路径加强为欧拉回路,那么只需要自底向上,对于一个度数为奇数的点,把它和它父亲的边再复制一边
答案就是\(\leq n-1+m\)的了
复杂度\(O(N+M)\)
P11904 [NHSPC 2023] C. 与自动辅助驾驶畅游世界
首先显然可以设\(dp[x]\)表示\(x\)点到\(t\)的代价,转移就有\(dp[x]=\min(\min_{x\rightarrow y}dp[y]+1,[\nexists x\rightarrow y,y走不到t]\max_{x\rightarrow y}dp[y])\)
考虑怎么转移,我自己想的那个很复杂啊,直接说最简洁智慧的办法吧
tj的转移 ✬✩
直接把图的边反向
考虑一层一层的转移,若当前已经弄完了\(dp[x]\leq v\)的,考虑哪些\(dp[x]=v+1\)
首先\(dp[x]=v\)能走到的点\(y\)都有\(dp[y]=v+1\)
再考虑什么情况用的转移式的后半,显然现在已经满足\(\max\)的要求的,只要考虑不能被非法点走到即可
发现其实就是从所有走不到\(t\)的点出发,不经过当前\(dp\)有值的点,所不能到达的那些点就是能用后半转移的点
复杂度\(O(N(N+M))\)
CF1503D Flip the Cards ✬✩
首先肯定能想到分成\(\leq n\)和\(>n\)的部分,然后显然所有\(i\)都要满足\([a_i\leq n]\neq[b_i\leq n]\)
如果有不满足的显然会出现矛盾的情况
然后可以让\(\leq n\)和\(>n\)的对应起来,即用一个\(f(i)\)表达\(i\leq n\)对应的那个\(>n\)的值
然后就是要求将序列\(\{f(i)\}\)分成两个子序列,满足每个子序列都是下降的
现在考虑怎么找最有解
发现如果前缀\(1\sim i\),\(\min_{j\leq i}f(j)>\max_{j>i}f(j)\),显然这两部分都没有关联了,那么就可以分开处理
现在把序列分成了几个区间,每个区间都不存在满足上述要求的前缀
我们如果只是\(check\)是否有解,每次肯定把\(f(i)\)放到可以放的当前栈顶最小的那个上面
发现此时我们每个区间,都只有唯一的一种合法操作,这个操作就是这个贪心操作,证明可以考虑依次找到当前还没处理的后缀中最大的那个数,然后发现它前面的数的方法都一定只能遵循这个办法放,它也只能这样放
复杂度\(O(N)\)
P11820 [PA 2015] 健身房 / Siłownia ✩✯
这种题,首先如果你确定要在\(k\)时刻操作,你就会取所有器材当前剩余可用中\(r\)最小的那个放进来
猜测每个时刻都最晚操作最优,感性理解很对,因为越晚操作,可以一起操作的器材就越多
证明考虑设一组合法方案\({p_1,p_2,...,p_k}\),然后当前第一次最晚操作在\(Q\),那么我们同样能找到一组合法的方案\(\{\max(Q+i-1,p_i)\}\)
那么现在考虑怎么找最晚的操作时间,显然可以\(hall\)定理,对器材\(x\)时刻\(i\),设\(c_{x,i}\)表示器材\(x\)的所有使用中,\(r\leq i\)的数量
那么第一次操作的最晚操作时间就是\(\min_{x,i} i-c_{x,i}\)
这个可以线段树实时维护的
但还有一个trick,就是这种区间覆盖常用的一种trick,若\(l_i\leq l_j\)且\(r_i=r_j\),显然会先操作\(i\),那么直接令\(r_i--\)即可
现在就能让同一颜色的所有\(r_i\)互不相同,此时发现,时刻一定是取某个端点,直接枚举时刻,如果当前有个点的右端点等于当前时刻,就意味着这是当前最晚的合法时刻
复杂度\(O(NlogN)\)
P11883 [RMI 2024] 信号 / Signals ✩
显然每一位独立,发现贪心不太行,又因为是环形的,也就是说,每一位的总变化都是偶数的,直接考虑\(dp[i][j]\)表示前\(i\)次操作后,当前有\(j\)位上是奇数次操作
注意到\(dp[i][j]\)转移到的\(dp[i+1][k]\)的\(k\)是一个区间的奇数/偶数,之前前缀和即可
找方案就倒回去就行
复杂度\(O(NK)\)
如果不要求输出方案,显然每个\(i\)的\(dp[i][j]\)为\(true\)的\(j\)是一段区间,可以直接做到\(O(N)\)的\(check\)是否有解
CF1610H Squid Game ✩
很豪丸的题
路径大致可以分为两类,直的(链头互为祖孙关系),弯的
设\(s_x\)为\(x\)子树内的点集
然后对于直的路径\((x,y)\),令\(x\)是\(y\)的祖先,\(z\)是路径上\(x\)的儿子,那么就要求\(s_x-s_y\)中有点被选
对于弯的路径\((x,y)\)就满足\(U-s_x-s_y\)中有点被选
发现对于弯的路径,限制非常的松,先不管它,只考虑直的,设\(dp_x\)表示\(x\)子树内合法(所有\(z\in s_x\)的路径都被满足了)且最少选的点数
那么有\(dp_x=\sum_{y\in son_x} dp_y\),然后如果\(x\)是一个\(w\),考虑那条路径是\((u,v)\),还有\(dp_x=\max(dp_x,dp_v+1)\)
最后考虑弯的路径\((u,v)\),只需要\(dp_{root}=\max(dp_{root},dp_u+dp_v+1)\)即可
复杂度\(O(N)\)或\(O(NlogN)\)
CF1322F Assigning Fares ✩
首先显然可以设\(k_i=[a_i<a_{fa_i}]\),最后的要求大概就会是一些\(k_i\)必须相同,一些必须相反
权值并查集即可维护
答案显然可以二分,考虑怎么\(check\)
然后现在边被分成了一些联通块,联通块与联通块之间可能会有一个点的交,这是麻烦的,先不管
显然对于同一个联通块内的边,如果\(k_i=1\),我们肯定会贪心地令\(a_i\)取到最小,\(k_i=0\)会令\(a_i\)取到最大,又因为取\(k_i=1\)和\(k_i=0\)是一个对称的过程,所以它们对应取到的\(a_i\)的值相加等于\(k+1\)
那么可以设\(dp[x]\)表示\(k_x=1\)时的\(a_x\)的最优值,显然\(k_x=0\)时\(a_x\)最优取\(k-dp[x]+1\)
同一联通块的转移是显然的
对于不同联通块间的转移,即对于\(x\),有\(y\in son_x\)且边\((x,y)\)是另一联通块的,先把所有在同一联通块的\((x,y)\)提出来,然后对应的能够得到\(dp[x]\)的取值区间,注意有两个且关于\(\frac{k+1}2\)对称,然后把所有区间都合并一下,最后再取\(dp[x]\)能取到的最小的即可
复杂度\(O(NlogN)\)
P8334 [ZJOI2022] 深搜
首先显然按权值可以从大到小加入所有点,然后考虑维护所有时刻的\(x\rightarrow y\)的概率,显然最后所有值加起来就是答案了
转移是简单的吧,就树上\(dp\)
考虑修改,首先一个点变成子树内所有点都被选的情况只有一次,也就是总的只有\(O(N)\)次,这个你就直接暴力往上跳的维护
然后再往上的其实就是某个dp值变了以下,直接全局平衡二叉树维护即可
复杂度\(O(NlogN)\)

嘻嘻四月一号做的放到三月做题记录里了,肯定不是忘了已经四月了,一定是愚人节彩蛋吧/se
浙公网安备 33010602011771号