3月做题记录
3月做题记录
✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补
- 3月做题记录
- qoj9879 [The 3rd Ucup Stage 21: Ōokayama E] ReTravel
- [The 3rd Ucup Stage 25: Hangzhou I] Identify Chord
- GDKOI 2021 生命游戏 ✯✩
- CF2068D
- CF2080D Order Statistics
- loj4807/P11882 [RMI 2024] 彩虹糖 / Skittlez
- loj4837/P9404 [POI 2020/2021 R3] Surowa zima
- P11928 [PA 2025] 子序列 / Podciągi
- CF2006C ✯
- CF2062E1/E2
- CF2062F ✩
- [PA 2025] 重金属 / Heavy Metal ✩✯
- [PA 2025] 砖块收集 / Zbieranie klocków
- PA2025 Opieka ✬
- CF2026F Bermart Ice Cream
- CF1188D Make Equal
- CF933E
- CF708E Student's Camp
- CF2057G ✩✬
- CF2057C
- CF2057F
- CF2057H
- CF1608F
- 「JOISC 2020 Day2」遗迹 ✯✩
- CF2081E Quantifier
qoj9879 [The 3rd Ucup Stage 21: Ōokayama E] ReTravel
发现我们一开始就直接走到\((\min\{x_i\},\min\{y_i\})\)肯定是不劣的,这启发我们对于任意一个区间,我们都可以先走到\((\min_{i\in[l,r]}\{x_i\},\min_{i\in[l,r]}\{y_i\})\),然后再进行后面的操作,这样光看这个区间肯定是不劣的
那么直接区间\(dp\)即可
复杂度\(O(N^3)\)
[The 3rd Ucup Stage 25: Hangzhou I] Identify Chord
判掉四元环
先固定\(x\),发现对于一个\(x\),一个区间\([l,r]\)(\(x\in[l,r]\),因为是环,可能出现\(l>r\)的情况)中的距离就是原本的距离,区间外的则会小于原来的距离,对于交界处附近就是我们的要找的点对\((u,v)\)
但是如果直接随机\(x\),可能会随到一个对于区间是\([1,n]\)的\(x\),但因为现在\(n>4\),一定有一个\(x\)会满足其对应的区间不是\([1,n]\),且问到它对应的距离为\(\lfloor\frac n2\rfloor\)的那个点的距离变了
找到这样的点是容易得,就随便\(1\)附近的点问几个就好了
询问次数\(O(logN)\)
GDKOI 2021 生命游戏 ✯✩
首先每个点下一时刻的值就是其四联通的四个点当前值的异或和
发现也就相当于每个
x
x x
x
相互匹配,然后把它们的异或值放到中心上去,可以发现,是否放到中心上去其实无所谓,只要所有的匹配放的位置不重且保持相对位置即可
那么我们给它放到最左边那个 x上去即可
现在问题转换成了\(a_{x,y}\)要异或上\(a_{x-1,y+1}\bigoplus a_{x+1,y+1}\bigoplus a_{x,y+2}\),这样有个好处,发现对网格图二分图染色,只有同色的点间才可能有操作
那现在可以分成两张图,每张图都是同色的点组成的,曼哈顿距离转切比雪夫距离就可以把它们变成两张独立的网格图了
前面这一块想到了后面就是简单的了
现在的操作可以转换为,点\((x,y)\)每次会让\(a'_{x,y}\)、\(a'_{x,y+1}\)、\(a'_{x+1,y+1}\)、\(a'_{x+1,y}\)都异或上\(a_{x,y}\),当然转换成\(\%2\)意义下的话其实就是让这四个直接加上\(a_{x,y}\)
考虑固定时间\(T\),判断点\((x,y)\)是否是\(1\),枚举所有的初始点\((a,b)\),那么\((a,b)\)对\((x,y)\)的贡献就是\(C_T^{x-a}\times C_T^{y-b}\mod 2\),那么结果为\(1\)当且仅当\(x-a\)和\(y-b\)都是\(T\)在二进制下的子集
直接算出\(f(S)\)表示初始位置为\(S\)的点都是\(1\)的点的个数
答案直接容斥就好了,容斥系数是\((-2)^{|s|-1}\),可以由二项式定理推出来
假设某个点集\(Q\)恰好就是由\(s\)表示出来的,那么它的贡献就是\(|Q|\times\sum_{i=1}^{i\leq|s|} (-1)^i\times C_{|s|}^i\times ???\),要求\(\sum_{i=1}^{i\leq|s|} (-1)^i\times C_{|s|}^i\times ???\)恰好等于\(1\),那么\(???\)就取\(2^i\)即可
然后看怎么算\(f(S)\),对于\(S\)中的所有初始点\((a_i,b_i)\)都要满足\(x-a_i\subset T\),\(y-b_i\subset T\)
设\(x_0=x-\max_i a_i\),\(y_0=y-\max_i b_i\),那么\(x-a_i\)就可以表示为\(x_0+(-a_i+\max_i a_i)\),\(y-b_i\)同理,现在就是找这样的\(x_0\),\(y_0\)的数量
固定了\(T\)的情况下,\(x_0\)和\(y_0\)是独立的,考虑到要进位,从低到高数位\(dp\),状态就是\(dp[i][c][0/1]\),\(0/1\)表示当前是否超过\(T\),\(c\)表示有几个\(-a_i+\max_i a_i/-b_i+\max_i b_i\)和当前数相加了要进位,显然是最大的那\(c\)个
考虑不固定\(T\),首先转差分,那么就是求\(T\leq R\)的\((T,x_0,y_0)\)的数量,把\(dp\)状态改成\(dp[i][cx][cy][0/1]\),这里的\(0/1\)表示\(T\)是否超过\(R\)
复杂度\(O(2^NN^2logN)\)
CF2068D
显然得到\(\{t_i\}\)后,\(f_i\)和\(t_i\)小的配大的最优
考虑怎么得到\(\{t_i\}\),判合法
放到\(trie\)树上,发现除了叶节点外,其余的点值为\(x\)的,都会分裂出值为\(x+1\)和值为\(x+2\)的,那么我们只要还原出这棵\(trie\)树即可
那么就是从大到小枚举\(t_i\)中的元素\(x\)(\(x>1\)),然后要求若此时\(x\)有\(k\)个,则\(x-1\)也必至少有\(k\)个,然后\(x\)删\(k\)个,\(x-1\)删\(k\)个,再插入\(k\)个\(x-2\)
最后只剩下一个\(0\)就是合法
那么考虑\(dp\),状态为\(dp[i][j][k]\),当前确定了\(i\)个,然后\((x,x+1)\)的数量情况为\((j,k)\)
两种转移,\((i,j,k)\rightarrow (i,k,j-k)(k\leq j)\),\((i,j,k)\rightarrow (i+1,j+1,k)\),可以多设一维表示当前\(x\)的值,但没必要,直接在每次一类转移的时候,贡献加上\(f_{1\sim i}\)即可
最后答案就是\((n,1,0)\),要求最后一次转移是一类转移
复杂度\(O(N^3)\)
CF2080D Order Statistics
别用umap/pbds存的树状数组。。。太慢了,不如线段树动态开点/ll
先排序\(a_i\),然后在第\(i\)位上放\(a_i\)个格子,操作就是后\(k\)个削一层,当然后\(k\)个中考前的那部分等价于削去和它同值的最小的几个的一层
发现这个操作还等价于,删\(m\times k\)个格子,每次删最高的,且每一列最多删\(m\)个
显然删除情况大概分为三部分,没动过的,删到\(lim/lim-1\)的,每一列都删了\(m\)个的
\(lim\)可以二分
然后线段树维护即可
复杂度\(O((N+Q)log^2V)\)
loj4807/P11882 [RMI 2024] 彩虹糖 / Skittlez
猫树分治 ✩
首先显然就是摩尔投票,考虑维护,这种矩阵加一般会需要差分,但摩尔投票不支持减法操作
那么就猫树分治+每一层扫描线即可
复杂度\(O((N^2+Q)\log N)\)
二进制 ✩◈
这个很牛啊
考虑把颜色的标号c二进制拆分,然后对于二进制下每一位\(0/1\),算出这一位是这个值的所有颜色在当前格子的数量之和
显然如果当前格存在绝对众数,那么二进制下每一位都会有绝对众数,且拼起来就是当前格的绝对众数
发现这样过后就可以差分了
复杂度\(O((N^2+Q)log Q)\)
loj4837/P9404 [POI 2020/2021 R3] Surowa zima
显然可以用充电站分成一个个的段,且段与段之间独立,那么我们只要求出每个段的贡献,然后合并起来即可
对于每个小段的走法,可以发现,每次充的电用来铲的雪一定是连续的区间,否则显然可以通过交换来把它们变得连续且这样一定不劣
那么现在可以把区间分成几个小段,手模一下可以发现,这些小段可以分为左边一些和右边一些,左边的得由左侧充电站提供电,右边的得由右侧充电站提供
首先题目可以转换成从一个充电站出发的走,以向左回旋为例,那么向右走到底后可能还会向左走一小点
<--------p
--------> ---------->
<-----
对于每个小段,只需要知道三大类最小值:
-
回旋
- 对于只有一侧有充电站的段(即两端的段)
<------------- -------------> <--------- ---------> <----- -----> <- ->显然
<所处的位置是公差为\(k\)的等差序列- 对于两端都有的
可以认为是两个上面拼起来的样子,当然其中一个要转个向
设其中一侧长度为\(x\),另一侧就是\(len-x\),设\(f(x)\)表示长度为\(x\)的这种回旋走法的代价,显然\(f(x)=(x+x-\lfloor\frac xk\rfloor k)\times(\lfloor\frac xk\rfloor+1)\),这是凸函数,那么总贡献\(f(x)+f(len-x)\)可以\(O(1)\)的算,最优决策点比较好找,但是也可以不用动脑子,直接二分出来就好
-
单侧走过去
- 对于只有一侧有充电站的段(即两端的段)
<------------- ---------> <--------- -----> <----- -> <-贡献是\(f(x)-x\)
- 对于两端都有的
假设是从左往右的单侧,左侧长度是\(x\),右侧就是\(len-x\),贡献就是\((f(x)-x)+(f(len-x)+(len-x))\)
同样,\(O(1)\)可以,不动脑子就二分就好
-
中间截止
- 对于只有一侧有充电站的段(即两端的段)
只能是单侧的样子
- 对于两端都有的
假设整体是从左往右的,那么就是单侧那个情况的右侧不用往右走回去,贡献就是\((f(x)-x)+f(len-x)\)
同样\(O(1)\)可以,二分\(O(log)\)可以
那么只需要用线段树或平衡树维护一下这些值的合并即可
复杂度\(O(NlogN)/O(N(logN+logV))\)
P11928 [PA 2025] 子序列 / Podciągi
注意到字符集很小啊,多半带点类似矩阵乘法的东西
考虑对于所有子序列\(t\),我们把它挂到它的最小匹配位置集合上
发现这样的集合\(u\)满足以下条件:
- 第一位\(u_1\),且\(\nexists i<u_1,s_i=s_{u_1}\)
- \(\forall i<|u|\),\(\nexists j\in(u_i,u_{i+1}),s_j=s_{u_{i+1}}\)
发现求出这样的集合\(u\)的数量后,只需要再减去在\(s\)中只会出现一次的\(t\)的数量即可,而这个的条件就是在上面的基础上,再加上\(\forall i<|u|\),\(\nexists j\in(u_i,u_{i+1}),s_j=s_{u_i}\)且对于最后一位\(u_{|u|}\),\(\nexists i>u_{|u|},s_i=s_{u_{|u|}}\)
可以类似矩阵的形式转移,两个转移的复杂度都可以做到三方的
总复杂度\(O(N|\sum|^3logN)\)
CF2006C ✯
有点,绞脑子,给我整红温了
首先最后形成的一定是一个等差序列,考虑这个差\(d\)一定是所有相邻两数差的\(\gcd\)的\(/2^k\)倍
然后发现这个所有相邻两数差的\(\gcd\)等价于把所有数任意排序后得到的相邻俩差的\(\gcd\)
因为对于原本的相邻的俩\(x\)和\(y\),差\(y-x\)一定能在后面这种表示中用某一段区间的\(+/-\)的组合弄出来,那么就一定是同一个\(\gcd\)了
然后\(baka's\ trick\)可以\(O(NlogV)\)
CF2062E1/E2
考虑\(E1\),从值大的到小的枚举每个点
首先,若点\(x\)子树外没有\(w_y\)大于\(w_x\)的点\(y\),显然这个点就必败了
发现我们找到的第一个存在子树外\(y\)满足\(w_y>w_x\)的点\(x\)就是必胜的了
再拓展到\(E2\)
首先发现,先手走到点\(u\)后,最多再继续走两步,否则走更多的步的话显然可以跳过中间的很多步
那么必胜,就必定是\(\rightarrow u\rightarrow v\),然后非\(u\)、\(v\)子树中的点,不存在\(y\)使得\(w_y>w_v\)
显然这就是充要的了,也就是\(\forall_{(x,y)},w_u<w_x<w_y\),满足点\(u\)子树中至少要有\(x\)、\(y\)中的一个
那么这个就遍历的过程中就给它解决了
复杂度\(O(NlogN)\)
CF2062F ✩
一点,拆\(\max\)的\(trick\)
这里的\(\max\)主要是同时涉及两个的值,有两种拆法:
- \(\max(a_i+b_j,b_i+a_j)=a_i+a_j+\max(b_i-a_i,b_j-a_j)\)
- \(\max(a_i+b_j,b_i+a_j)=\frac{a_i+b_j+b_i+a_j+|(a_i+b_j)-(b_i+a_j)|}2\)
这样拆了过后发现\(i\)和\(j\)就比较独立了
然后按对应值排序后直接\(dp[i][0/1/2]\)表示长度为\(i\),首尾是否确定即可
复杂度\(O(N^2)\)
[PA 2025] 重金属 / Heavy Metal ✩✯
算是BSGS?
对于任意一对\((L,R)(L\times R\geq p_n)\),任意一条合法路径,都能找到一条边,满足这条边之前的边的乘积\(\leq L\),之后的边的乘积\(\leq R\)
然后就类似\(BSGS\)的做法了,先对每个点算出起点到它能不能走出权值为\(x\)的路径,以及它到终点的,然后枚举上面说的那条边,再枚举\(L\),双指针\(R\)
这里\(L\)取\(\sqrt{p_nlogn}\)可得复杂度\(O((N+M)\sqrt{VlogN})\)
[PA 2025] 砖块收集 / Zbieranie klocków
最后的维护方式,好像能用set直接维护,但是不会啊
网上的题解是用神秘odt维护的
手模一下可以发现,显然删不掉的就是\(4\times 4\)的小矩阵,和这些矩阵间的斜线
oo
oo
oo
oo
oo
oo
oo
然后啥子odt或set维护,不会,luogu上看了一圈感觉全是odt,摆了
哦,可以上一手线段树分治,大大滴好/qiang
PA2025 Opieka ✬
很牛啊
首先肯定可以二分答案,但注意到要求我们输出最简分数比,发现分子是\([1,l]\)的,分母是\([1,n]\)的,因为显然每个人睡觉为了避免冲突,要么就在整数点睡的,要么就是挤在一起的睡的,显然这个挤在一起的,它们最优就会是平分那些段
然后考虑\(check\),显然是可以直接枚举出所有可能的睡觉顺序,然后贪心的做,但复杂度无法接受
这里有个性质,在目前已经确定的睡觉的那些人和区间下,对所有剩下的人求出他们最早可以睡觉的时间点,下一个睡觉的一定是这个时间点最早或次早的
证明就是,考虑我们对每一段(即max(上一个人的结束点,这一个人的开始点)到这一个人的结束点的这一段),这一段内的睡觉的人数是确定的,设为\(d\),找到段内最晚满足初始时在该点\(t\)休闲的人数\(\leq d+1\)的\(t\),那么下一个人睡觉的开始点必须\(>t\)
然后如果我们选了后面的点(既\(\geq 3\)早点),显然它们如果能放,那么我们也能把最早的点放下去,显然就一开始就把最早点放了更好,这些都是由第二早的点来保证的
然后就\(dfs\)下去即可
复杂度\(O((2^N+L)Nlog(NL))\)
CF2026F Bermart Ice Cream
baka's trick
CF1188D Make Equal
生命游戏的一部分
取\(mx=\max_i\{a_i\}\),显然最后要求的就是\(\min_x \sum_{i=1}^npopcount(mx+x-a_i)\)
然后\(dp[i][j]\)表示考虑了\(0\sim i\)位,向\(i+1\)位有\(j\)个要进位,显然进位的\(j\)个就是\(mx-a_i\)只看\(0\sim i\)位的最大的\(j\)个
用归并排序可以做到\(O(NlogV)\)
CF933E
唉,dp输出方案题就是邪恶/fn
显然最后,除去初始就是\(0\)的位置,那些相邻\(0\)段长度不超过\(2\),直接\(dp\)即可
然后输出方案有点细节问题,就是\(dp[i-2]\rightarrow dp[i]\)的时候,有可能\(p[i]\)也会变成\(0\),其实就是这个\(i\)在边界上的情况,那么这种情况直接让\(p[i-1]-=p[i]\)然后再操作即可
复杂度\(O(N)\)
CF708E Student's Camp
初始的\(dp\)就是\(dp[i][l][r]\),然后采用容斥的思想拆成\(f[i][l]\)和\(g[i][r]\)
复杂度\(O(N^2+KlogV)\)
CF2057G ✩✬
很牛啊
抽屉原理的\(trick\),这种构造方案,还要求步数之类的要小于某个平均值,就可以考虑多种构造方式,使得它们的和恰好满足题目要的那个和
这里考虑构造\(5\)种方案,要求它们的步数和恰好等于\(s+p\)
首先如果从贪心的放法入手,手模一下,可以发现,我们只需要对网格图进行五染色,满足若网格图无限延伸,那么每个格子和它四联通的格子的颜色全都互不相同,格子\((i,j)\)染成\(i+2j\%5\)
那么方案\(i\)就是取所有颜色为\(i\)的点,然后再取那些没被覆盖的点,注意到这些没被覆盖的点一定满足在无限延伸的网格图上,周围会有一个颜色\(i\)的格子,也就对应到\(p\)上了,所以所有方案的步数和就恰好是\(s+p\)了
复杂度\(O(NM)\)
CF2057C
考场上犯糖的做法给自己气笑了,写这里当个乐子
正解就发现,\(2^i\)位有贡献当且仅当\(a\)、\(b\)、\(c\)在这一位不全相同,且贡献一定是\(2^i\times 2\),于是找到\(l\bigoplus r\)第一个为\(1\)的位,然后\(a\)在这一位取\(0\),后面取\(1\),\(b\)在这一位取\(1\),后面取\(0\),\(c\)随便选一个非\(a\)非\(b\)的数即可
然后比较唐诗的做法就是,直接数位\(dp[i][0/1][0/1][0/1][0/1]\),考虑\(i\sim 30\)位,钦定\(a<b<c\),然后\([a=b]\),\([b=c]\),\(a\)是否处于边界,\(c\)是否处于边界
真的很难绷
复杂度都是\(O(logV)\)
CF2057F
挺典的,为啥是黑的?
首先可以对每个询问枚举最大值点,得到对应改变的长度\(len\),这样复杂度是\(O(NQlog^2V)\)的
反过来,枚举所有最大值点和长度,会得到一个\(k\)的范围,然后预处理一下就可以在线处理询问了
复杂度\(O(Nlog^2V)\)
CF2057H
操作等价于\(a_i-=2\),\(a_{i-1}+=1\),\(a_{i+1}+=1\)
显然可以算出\(f[i]\)表示\(a_{1\sim i}\)最多给\(a_{i+1}\)进多少数,\(f[i+1]\)肯定是在\(f[i]\)的基础上转移来的
考虑到\(a_{1\sim i}\)只有\(0/1\),然后维护\(0\)的位置就可以做了
复杂度\(O(N)\)
CF1608F
显然\(mex\)是不降的,考虑设\(dp[i][j][k]\)表示\(1\sim i\)填入了数字,当前\(mex=j\),填了\(k\)种\(>mex\)的数
直接转移是\(O(N^2K^2)\)的,用个数组优化一下中途的转移可以做到\(O(N^2K)\)
很卡常/tuu
「JOISC 2020 Day2」遗迹 ✯✩
同种数分类的数量/阶乘\(\rightarrow\)同种数不分类的数量 的\(trick\)
设\(i\)点的初始高度是\(h_i\),最终高度是\(e_i\)
首先找点性质
- 设\(p_v\)表示存在某一时刻满足\(h_i=v\)的最大的那个\(i\),那么最终\(e_j=v\)的\(j\)一定满足\(j\geq p_v\)
- 手模一下可以发现,\(e_i\neq0\)当且仅当\(mex_{j>i}\{e_j\}\leq h_i\)
这里\(mex\)w定义为最小没出现过的正整数
证明:
显然如果\(h_i<mex\),那么\(h_i\)在这个途中一定会删成\(0\)
如果\(h_i\geq mex\),反证,若它被删成\(0\),考虑当它恰好被删成\(mex\)时,此时后面一定要有一个\(=mex\)的才能继续继续删\(h_i\),也就是说,最终\(e_j=mex\)的\(j\)一定有\(j>i\),那么此时\(mex\)就不是\(mex\)了,矛盾,证毕
然后考虑怎么计算方案数,发现原题目要求的,两个同种高度是等价,这样不好计算,我们另这两个不等价,最后除一个\(2^n\)即可
设\(f[i][j]\)表示考虑了\(i\sim n\),当前\(mex=j\)的方案数,对于那些\(e_k>j\)的先不管
设\(c_0\)表示\(i\sim n\)中\(e_k=0\)的数量,\(c_1\)表示\(i\sim n\)中\(e_k>j\)的数量
若\(h_{i-1}<j\),转移\(f[i-1][j]\leftarrow f[i][j]\times(j-c_0)\)
若\(e_{i-1}>j\),转移\(f[i-1][j]\leftarrow f[i][j]\)
若\(e_{i-1}=j\),转移\(f[i-1][p]\leftarrow f[i][j]\times C_{c_1}^{p-j-1}(p-j+1)g[p-j-1]\)
\(g[i]\)表示从\(1,1,2,2,...,i,i\)中选\(i\)个,且操作后不会有高度被清空的方案数
因为要求了不会有高度被清空,所以直接枚举第一位取什么\(g[i]=\sum_k C_{i-1}^{k-1}g[k-1]g[i-k]\times (i-k+2)\)
CF2081E Quantifier
显然可以先把所有点下放到它能放的最底下的位置,然后往上合并
注意到这里下放到能放的最底下的位置不一定是它的那个范围,被卡了好久/tuu
然后合并设\(f[u][i][0/1]\),顶端颜色为\(0/1\),长度为\(i\)
树形背包即可,注意树形背包如果先枚举和\(S\),枚举\(s_1\)里取的数的数量范围是\([\max(1,S-s_2),\min(S,s_1)]\),被这个卡了好久/tuu
然后再和\((u,fa_u)\)上的点合并
复杂度\(O(N^2)\)
做这道题的时候像被上了唐氏buff,调了一晚上+早上1h/tuu

布响whk辣
浙公网安备 33010602011771号