3月做题记录

3月做题记录

✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补

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\)

首先找点性质

  1. \(p_v\)表示存在某一时刻满足\(h_i=v\)的最大的那个\(i\),那么最终\(e_j=v\)\(j\)一定满足\(j\geq p_v\)
  2. 手模一下可以发现,\(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

posted @ 2025-03-16 20:21  LuoyuSitfitw  阅读(123)  评论(0)    收藏  举报