2024.10模拟赛记录

2024.10.09

得分 \(30+0+30+0=60\)

T1 序列

T2 贪吃蛇

赛时暴力打挂了。。。

发现这道题如果这个人已经吞并了一个连通块的人,现在他要扩展疆域,肯定是去找边境(与连通块相连且不在连通块内)找战力最低的打,如果打不过,那么打其它的更打不过了,所以此人无法统一全国(占领全境)。

所以发现每一次找最小的人并将其击败,这个过程有点像最小生成树,类似P9984,不过是把加边变成加点了。

所以可以将点权从小到大排序,用并查集维护连通块,每一次将这个点的四联通点考虑合并,因为当前点一定是四联通点所在连通块外的战力值最小的敌人。

所以如果四联通点的连通块的和小于当前点的权值,那么这个连通块内所有点的答案都应该为 \(0\),因为连通块内的点无法达到更大的状态。

如果和大于当前点的权值,则将该连通块与当前点所在连通块(此处必须为当前点所在的连通块,因为可能会存在多个权值相同且相邻的点)合并。

最终答案为 \(1\) 的点是没被标记的点。

但是如果暴力去枚举连通块内的点,时间复杂度会炸,约为 \(O(n^2m^2)\),所以考虑建一个广义Kruskal重构树,为什么是广义呢,因为可能是一棵多叉树。我们在如上枚举节点时,向比他小的四联通点所在连通块连边,然后再合并,这样我们可以直接修改树上结点。修改结束后把整棵树遍历一遍,如果一个节点的任意祖先被标记为 $ 0 $ ,则它的答案也为 $0 $,否则为 $1 $。

时间复杂度\(O(nm\log(nm)+nm)\)

好像还有线段树合并的做法。

T3 蛋糕

T4 简单树上路径

2024.10.11

得分 $100+20+10+20=150 $,暴力没打满。。。

T1 3 idots

就是一个判断字符串是否相同的题,然后我写了双哈希。。。调了一个小时。。。

还好过了。

好像有几个大佬都挂了(默哀。

T2 冒泡排序

赛时拼了个暴力就溜了。

定义一轮为for(int j=1;j<=n-i;j++)if(a[j]>a[j+1])swap(a[j],a[j+1])

其实可以发现在一轮中向右挪的值从左往右单调递增。

在一轮中有一个数没有向右动,当且仅当左边有比他大的数。

所以考虑去找在第几轮时 $ k $ 会用完,或者说是 $ k $ 最多能满足前几轮的全部交换。

我们想要知道这个,就要算出在前几轮的交换总数。

这个东西怎么求?

根据我们上面求出的结论,每一次交换会有一个数向右挪,另一个数向左挪,我们只用统计所有数往左挪了多少次就相当于统计交换了多少次。

首先每一轮每一个数最多会往左挪一次且挪动当且仅当左边有比他大的数。所以记录 \(minn_i\) 为 $$ \sum_{j\in[1,i-1]} [a_j>a_i] $$。设当前交换了 $ w $ 轮,则交换总数为

\[\sum_{i=1}^{n}\min(w,minn_i) \]

然后就可以二分答案出最多可以交换的轮数使得剩余 $ k $ 大于等于 $ 0 $ 。

接下来这一轮 $ k $ 不够用了,需要暴力跑一遍判断最终的排列 $ a $ 。所以我们还要求出在 $ w $ 轮后的 $ a $ 数列来暴力。

那么可以发现对于 $ i $ 而言,如果 $ minn_i\ge w $ ,则i在这w轮中,一定不会往右移,且每一轮都会往左移,所以它最终的位置一定是 $ i-w$ 。

而剩下的数一定会被右移到某个位置且最终它左边的数都会比它小(因为所有数都比它小时才会向右移且移动过程中左边不会出现比它大的数)。所以把剩下的数从小到大排序,然后依次放入空着的位置上。

最后再像上面说的一样跑一轮暴力即可。

时间复杂度 \(O(n\log n(\)二分答案轮数\()+n+n\log n\)(排序得出 $w $ 轮后的序列\()+n(\)暴力跑一轮\())\)

T3 多重集

赛时想复杂了,都想到坐标系上去了。

这个最大值最小有点迷惑人,让人想到二分答案。

发现这个 $ \max $ 有点烦人,考虑分类讨论将其拆开。

  1. 若 $ a_x+b_x\ge a_y+b_y $ ,则有 \(a_x-a_y\ge b_y-b_x\)。所以对每一个 \(A\) 集合元素记\(h_x=a_x-a_y\),对每一个 \(B\) 集合元素记\(h_x=a_y-a_x\),则有\(h_x\ge h_y(x\in A,y\in B)\),答案为 \(\min(a_x+b_x)\)
  2. 若 $ a_x+b_x\le a_y+b_y $ ,则有 \(a_x-a_y\le b_y-b_x\),即\(h_x\le h_y(x\in A,y\in B)\),答案为 \(\min(a_y+b_y)\)

所以可以考虑分治思想,将这个偏序关系转化一下。

而我们又需要动态维护最小值,所以想到线段树。

我们先将操作离线下来,对于每一个点求出其 $ h $ 值,再离散化并按 $ h $ 值建出值域线段树,每个节点维护\(a_x,a_y,b_x,b_y\)的最小值。

因为要支持加入和删除,所以在线段树的每一个叶子节点上建立四个multiset,分别存下 \(h\) 值为 \(l\) 的所有\(a_x,a_y,b_x,b_y\)值,然后每一次修改后,将该叶子存的\(a_x,a_y,b_x,b_y\)的最小值从multiset开头取出更新即可。单次修改\(O(\log n)\),略带些常数。

现在考虑查询。改题时,我直接将整棵树遍历一遍求值,却忘注意了时间复杂度,致使改了半天没过,还以为被卡常了。

其实我们将答案存在每一个节点上,初始化为无穷大,然后随着节点的更新而更新,这样的复杂度才是正确的。

所以这道题就做完了。单次添加/删除时间复杂度\(O(\log n)\),单次查询时间复杂度\(O(1)\)。总时间复杂度 $ O(n\log n) $ 。

完结撒花!

不得不说,还是有难度的。(擦汗

T4 简单题

原题: CF878E

*3300啊,/瑟瑟发抖。

2024.10.12

得分\(100+15+20+20=155\)

T1 社团活动

坐标轴上有 $ n $ 个人,每个人坐标为 $ x_i $ ,对于每一次查询,求出最优的 $ p $ 使得$$\sum_{i=l}^r|x_i-p|$$最小。

根据初一学的,当点数为奇数时选最中间的那个,否则选中间两个构成的闭区间为最优。

不如就选第 $ \lfloor\frac{n+1}{2}\rfloor$小的数,转化为静态区间第 $ k $ 小问题,用主席树维护。然后设\(f_i\)为 $ i $ 的坐标,则答案为 $$ k\times a_{l+k-1}-\sum_{i=l}^{k}f_i +\sum_{i=k+1}^{r}f_i-(r-l-1-k)\times a_{l+k-1}$$,所以在主席树上维护\(f\)的和。

时间复杂度 \(O(n\log^2n )\)

JMR写的\(O(n\sqrt n\log n)\)。OJ上被卡了(悲,不过Lemon上过了(喜。

T2 电梯

正解是贪心+高精度

T3 抢凳子

数论题

T4 高速收费

转化为网络流

类似P7916

2024.10.16

得分\(100+64+10+36=210\),第一次在NOIP难度上 $200 $ 。

T1 扭曲的

有一个\(n\times n\)的棋盘(保证n为奇数),你可以选择多个格子,依次以每一个格子为中心生成一个\(n\times n\)的布来覆盖棋盘的一部分。选择每个格子都有代价,请求出最小的选点方案使得棋盘的每一个格子都至少被一张布覆盖。

考虑一个格子在什么情况下不会被覆盖,推出那些格子中必须有一个点。

把重复的和无意义的去掉后,设 \(mid=\lfloor \frac{n+1}{2}\rfloor\),则在以 $ (mid,mid) $ 为顶点,以大矩形的角为另一顶点的左上、左下、右上、右下中各至少选一个点。

预处理出上述四个矩形内的最小值,发现如果取第 $ mid $ 行或第 $ mid $ 列或者取 $ (mid,mid) $ 的话可以少取几个顶点。以此分类讨论选\(4\)\(3\)\(2\)\(1\)个点的情况,然后取\(\min\)

时间复杂度 $ O(tn^2) $ 。

T2 命运

发现可以分成 $ [1,x] $ 和 $ [x,n] $ 讨论。

后者实际上是求一个长度为$n-x $ 首项为 $ a_{x+1}-a_x $ 的单调不升的序列个数。

我赛时想复杂了,枚举首项和末项,然后答案为\(\sum_{i=1}^{a_{x+1}-a_x} C_{n-x-1+i}^{n-x-1}\)。本来想着过\(n\le3000,V\le 10^6\)的点的,没想到还过了一个\(n\le2\times 10^5,V\le 10^8\)的点?!这数据也太水了,时间复杂度是\(O(V\log V)\),数组也只开到了 $ 10^6 $ ,然后把 $ 10^8 $ 的点过了?而且还是捆绑?

实际上换一个角度想,我们不用去枚举末项。我之前的想法是有\(n-x+i\)个盒子,选择在其中\(n-x\)个盒子放小球,放了小球的盒子代表序列中的一个下标,它到前方的第一个盒子直接没放小球的盒子个数代表它与前一个数的差。

但是会发现最后一个小球后的盒子无意义,所以就固定最后一个小球在最后一个盒子,即为$ C_{n-x-1+i}^{n-x-1}$。但其实不用,我们规定最后一个小球后的盒子个数代表末项的大小。则答案为 \(C_{n-x+a_{x+1}-a_x}^{n-x}\),把和式去掉了。时间复杂度 \(O(V+\log V)\)

然后再考虑前面的\([1,x]\)区间,发现条件与后面的不太一样,所以考虑dp,然后加了个前缀和优化,时间复杂度\(O(nV)\),过不了更大的点。

赛后看了题解,发现其实设\(a_0=0,b_0=0\),则对于\(i\in[1,x)\),有\(a_i-b_i\ge a_{i-1}-b_{i-1}\ge0\),则\(a_i-a_{i-1}\ge b_i-b_{i-1}\ge b_i-a_{i-1}\),记\(a'_i=a_i-a_{i-1},b'_i=b_i-b_{i-1},i\in[1,x)\),则条件为\(a'_i\ge b'_i\)

然后为什么不用担心有人会挂成负分呢?可以根据它的意义看出。因为 \(b'_i\)\(i\)\(i-1\) 多挂的分,只要这个涨幅比 \(a\) 慢就不会挂成负数。

所以前面部分答案为\(\Pi_{i=1}^{x-1}(a'_i+1)\)

最终答案为两部分乘起来。

时间复杂度\(O(n+V+\log V)\)

T3 深奥的

原题:P9731

欧拉回路+分治

先考虑 $ S=2 $ 怎么做,可以发现实际上就是对于每一行的两个元素,建一条边,然后我们需要满足两边的个数差为 $ 1 $ ,就相当于给这个图定向,则就相当于构造每一个点的出度入度差不超过 $ 1 $ 。可以想到欧拉回路。

无向图上的欧拉回路满足每一个点的出度入度都是偶数,但是有些点的度数是奇数,所以考虑用一个超级源点向所有度数为奇数的点连边。

这样在每一个连通块跑出的欧拉回路再去除掉超级源点后就是每条边的定向方案。

S=2的代码

然后考虑正解。

发现题目中有一个较为特殊的条件:序列长为\(2^k\)

那么根据此和之前 $S=2 $ 的做法可以想到用分治做。我们将序列看成\([1,2^{k-1}]\)\([2^{k-1}+1,2^k]\)两部分,现在我们只需要判断每一行的哪些元素应归在左区间,哪一些元素应归在右区间。

这个其实类似\(S=2\)的做法,为了方便我们对于每一行,将\(a_{i,j}\)\(a_{i,j+2^{k-1}}\)连边(即区间两端元素顺次连边)(注:其实怎么连都可以,只要保证左区间的元素与右区间的元素相连即可,不重不漏)。然后像\(S=2\)一样用超级源点去掉度数为奇数的点。

然后只需要找到一种方案使得左边的每个元素的出现次数(在图中即为每个点的出度)等于右边每个元素的出现次数(即为每个点的入度)。

T4 困境

原题:CF1707E

*3500啊,赛时是哪些神仙切了的。

2024.10.18

得分\(100+85+23+0=208\)

T1 平衡的白鸽

可能的原题:QOJ8831

贪心题。

首先我们先将序列从小到大排序,如果第 \(a_{2i+2}-a_{2i+1}>A(i\in[0,\frac{n}{2}))\)则一定无解。因为如果我们不想要任何一对匹配越过它,否则就会超。但是我们发现,左边有奇数个翅膀,右边有奇数个翅膀,必有一对匹配越过这一段。所以必定无解。

然后我们发现一种合法的分法是\(\{(a_1,a_2),(a_3,a_4),(a_5,a_6)...(a_{n-1},a_n)\}\)\(a\)为排完序后的序列)。但是样例二给出了反例:当\(A=6,B=1\)时,\(\{1,3,4,6\}\)这样分会更优:\(\{(1,6),(3,4)\}\)这样答案是\(1\),而\(\{(1,3),(4,6)\}\)答案为 \(0\)

所以说更优情况并不一定是直接相邻两项进行匹配。可能会有一个匹配变大在值域上覆盖另一个匹配。

但又推性质会发现除去相邻的两项构成的匹配,剩下的覆盖其他匹配的匹配不会有交集。如果有,则一定可以变为更优情况。

举个例子: 如果我们不考虑\(A\)的限制,则如果有\(\{(a_1,a_8),(a_2,a_7),(a_3,a_4),(a_5,a_6)\}\),则可以改为\(\{(a_1,a_2),(a_3,a_4),(a_5,a_6),(a_7,a_8)\}\),而后者更有可能会有更多答案。

所以考虑用dp枚举分段,如果有覆盖则\(dp_i=\max_{j=1,j为偶数且a_i-a_j\le A}^{i-3}dp_j+w(j+1,i-1)\)\(i\)为偶数。当然也可以不覆盖,则有\(dp_i=dp_{i-2}+w(i-1,i)\)

然后上式的\(\max\)值可以用单调队列或线段树处理。

我赛时写的单调队列,时间复杂度 \(O(n)\)

T2 你也在这里

感觉好像除了码量大,就是码量大。

二分答案加拓扑排序。不多解释。

时间复杂度\(O(S\log n)\)

本地测\(S=10^7\)的大样例以为过不了,然后把\(S=10^7\)的几个性质写了,最后除了写了的那两个性质,其他的都过了。。。也就是说实际上跑的过,然后性质写错了。

因为时限有5s

UPD:赛后改过了,发现不仅是性质打错了,二分答案的上界是 \(\min(n,m)-1\)而非 \(n-1\)

T3 卜卦

T4 都是假的

原题:CF1493F

2024.10.21

得分\(100+10+70+0=180\)

其实这场比赛因为昨晚失眠而在考场上睡了一个小时。而这一个小时可以做很多事情。第二题的另一档\(15\)分暴力最后差一点点调出来,第四题暴力没打,甚至连题都没看。所以晚上要早睡,开考后前半个小时不动键盘,浏览试卷。

然后考试目标是:能打正解打正解,如果感觉调不出或想不出就打暴力,拿部分分。题题对拍+静态查错。

T1 逆序对

首先对于没有强制要求\(a_i<a_{i+1}\)的地方就直接让它\(a_i>a_{i+1}\)就行了。

因为我们最后要做一个拓扑排序,所以需证明没有环。很好证,每个点最多两条边,感性理解吧。

然后就是P3243一样的思路了。拓扑排序的队列用小根堆代替。

然后还要求逆序对个数,用树状数组跑一遍即可。

时间复杂度\(O(\sum n\log n)\)

T2 美丽值

实际上看到问题就可以发现最终问题实际上就是该序列经过从大到小排序后的$\sum_{i=1}^{\lfloor\frac{n}{2}\rfloor}b_i - \sum_{i=\lfloor\frac{n}{2}\rfloor+1}^{n}b_i \(。即前\)\lfloor\frac{n}{2}\rfloor\(大的值与前\)\lfloor\frac{n}{2}\rfloor$小的值的差。

测试点1-2 \(\ \ \ \sum n,\sum V\le 7\):

暴力枚举序列,判断最大值。

时间复杂度\(O(V^n)\)

测试点3-5 \(\ \ \ \sum n\le 5000, \sum V\le 3\):

枚举\(a_i=v,v\in[1,3]\)的个数,然后统计情况。

时间复杂度\(O(\sum nV^3)\)

测试点9-15 \(\ \ \ n\le 70,V\le 5000\):

考虑dp。

\(g_{i,j}\)为排完序后前i个数值域为\([1,j]\)的方案数。\(dp_{i,j}\)\(g_{i,j}\)对应的答案总和。

去枚举这个数到底在序列中有几个,则有转移方程:

\[\\ dp_{i,j}=\sum_{k=1}^{i-1}(dp_{k,j-1}+val(i,k)\times j)\times\dbinom{n-k}{i-k} \]

\[\\ g_{i,j}=\sum_{k=1}^{i-1}g_{k,j-1}\times\dbinom{n-k}{i-k} \]

最后因为是值域\([1,j]\),所以还需统一个类似前缀和的东西。

\[\\ dp_{i,j}\gets \sum_{k=1}^{i-1}dp_{i,k} \]

\[\\ g_{i,j}\gets \sum_{k=1}^{i-1}g_{i,k} \]

初始化\(dp_{i,0}=0,g_{i,0}=1\)

时间复杂度\(O(\sum n^2V)\)

测试点10-14 \(\ \ \ n\le 2000\):

dp太慢了,我们能不能将其转化为数学式子进行计算?

我们上文推出答案为前几个最大值与前几个最小值的差,所以说如果我们把最大值与最小值相匹配,把次大值与次小值相匹配,以此类推,则答案为每一个匹配的差的和。

一个序列如果我们枚举\(v\in[1,V]\),对于一个匹配\((i,j)\),如果有\(i< v\le j\)则将答案加\(1\),则最终该匹配会加\(j-i\)次,与它的贡献相等,所以我们可以再次转化问题,转化为对于\(v\in[1,V]\),有多少个匹配使得\(i<v\le j\)

我们枚举\(a\)序列中值在\([1,v]\)的数的个数,记为\(c0\),记\(c1\)\(a\)序列中值在\([v+1,V]\)的数的个数,则有\(c1=n-c0\)。则这个\(v\)的贡献为\(\min(c0,c1)\)

就如这个图,每一条黑色的边代表一个匹配,红线代表\(v\),则位于红线左边的点有\(c0=4\)个,位于红线右边的点\(c1=2\)个,然后实际红线穿过的匹配有\(\min(c0,c1)=2\)个。

但是这\(n\)个数的值域大小虽然定了,但是排列方式和具体数值却可能有多种,所以还需乘上\(v^{c0}\times (V-v)^{c1}\times \dbinom n {c0}\),分别对应前\(c0\)个数的具体值的方案数,后\(c1\)个数的具体值的方案数,这\(c0\)个数的排列方案数。

这个幂不能每一次都用快速幂求,因为时间复杂度会多一个\(\log n\),无法通过。所以用递推的方式求出。

则最终答案为

\[\\ \sum_{v=1}^{V}(\sum_{c0=0}^n \min(c0,n-c0)\times v^{c0}\times (V-v)^{n-c0}\times \dbinom n {c0}) \]

时间复杂度\(O(\sum nV)\)

T3 最大值

测试点1 \(\ \ \ n\le 20\):

暴力枚举非空子集,用哈希表去重,统计答案。

时间复杂度\(O(t2^n)\)

测试点2-4 \(\ \ \ a_i=b_i\):

实际上只用判断\((\max a_i,\max c_i)\)的个数。枚举\(\max a_i\),答案为$$\sum_{i=1}{n}\sum_{j=1}[c_j\ge c_i] $$。用树状数组维护。

时间复杂度\(O(\sum n\log n)\)

测试点5-9 \(\ \ \ n\le 500\):

分别枚举\(\max a_i\)\(\max b_i\)\(\max c_i\)。判断是否合法。

时间复杂度\(O(tn^3)\)

测试点10-14 \(\ \ \ n\le 2000\):

先按 \(a_i\) 从大到小排序。然后枚举满足\(a_j\le a_i\)\(j\) 。则答案为$\sum_{k=1}^{n} [b_k\le b_j&&a_k\le a_i&&c_k\ge\max(c_i,c_j)] \(。有点像一个偏序问题。所以排完序后,对于每一个\)i\(,枚举\)j\ge i\(且\)b_j\ge b_i\(。然后将剩余数组按\)b_i$升序排序,求一个逆序对即可。

时间复杂度\(O(\sum n^2\log n)\)

测试点15-20 \(\ \ \ n\le 10^5\):

上面提到了可能与偏序有关系。所以会用到cdq分治

如果只选一组数,那么有\(n\)种不同结果。

如果选两组数,那么一共有\(\dbinom{n}{2}\)种选法,但是可能会与只选一组数重,所以需要去重(重复时说明另一组数对答案无贡献,即最大值都在另一组内)。设选的分别为第\(i,j\)组,那么需满足\((a_i<a_j)\wedge (b_i<b_j)\wedge (c_i<c_j)\)。这个就相当于是求一个三维偏序问题用cdq分治解决。

如果选三组数,那么一共有\(\dbinom{n}{3}\)种选法,同样需去重,那么当它重复时,当且仅当最大值中的至少两个在同一组内。

先考虑与选两组数相同的情况:

  • 则说明其中两个最大值会出现在同一组。考虑枚举这一组(因为限制条件最多),设其为\(i\),然后设另外两组选了第\(j,k(j\neq k)\)组。我们还需要枚举是那两个的最大值在这一组(以下以\(a,b\)为例),则需满足\((a_j<a_i)\wedge(b_j<a_i)\wedge(a_k<a_i)\wedge(b_j<b_i)\)。也就是对于\((a_p<a_i)\wedge(b_p<b_i)\)中的解集中任选两个。这里是一个二维偏序问题,用树状数组处理。

  • 但是可能会多减了一些东西,像选两组数时处理出的三维偏序就会被减三次,需加回三次。

  • \(a,b\)最大值在第\(i\)组的偏序个数为\(ab_i\),记\(a,c\)最大值在第\(i\)组的偏序个数为\(ac_i\),记\(b,c\)最大值在第\(i\)组的偏序个数为\(bc_i\),记后项为\(i\)的三维偏序个数为\(tmp_i\),则去重的数量为:

    \[\\ \sum_{i=1}^{n}\frac{ab_i\times(ab_i-1)+bc_i\times(bc_i-1)+ac_i\times(ac_i-1)-3\times tmp_i\times (tmp_i-1)}{2} \]

当然,还没完。选三个数还可能与选一个数答案一样:

  • 实际上就是三维偏序中后面的那个。则为\(\dbinom{tmp_i}{2}\)种相同的,所以上式要加上\(\frac{tmp_i\times(tmp_i-1)}{2}\)

则最终答案为

\[\\\dbinom{n}{1}+\dbinom{n}{2}+\dbinom{n}{3}-\sum_{i=1}^{n}\frac{ab_i\times(ab_i-1)+bc_i\times(bc_i-1)+ac_i\times(ac_i-1)-2\times tmp_i\times (tmp_i-1)}{2} \]

类似容斥思想。

时间复杂度\(O(n\log^2n)\)

T4 进制幂

2024.10.23

今天在初三机房打的比赛。

得分\(100+48+75+0=223\)

好吧,我也不知道为啥要考梦熊的题,而且就是首页最上方的那场比赛

T1 youyou 的垃圾桶

带修,区查,想到线段树。

可以二分是在第几回合所有怪物不能全部攻击一次。然后二分\(+\)区查一下。时间复杂度\(O(q\log V+q\log ^2 n)\)

但是本地测了一下,极限数据要跑\(5s\),过不去。

考虑优化。把二分\(+\)区查改为线段树内二分可以省去一个\(\log\)。然后计算第几回合,这里其实可以\(O(1)\)计算,设其为\(k\),所有怪物攻击力和为\(sum\),则\(k=\lfloor\log_2(\frac{health}{sum})\rfloor\)

时间复杂度\(O(q\log n)\)

T2 youyou 不喜欢夏天

以下用01表示一列的第一行为0,第二行为1。其它同理。

首先发现11选这一列答案加\(+2\)并且不会因为交换行而变化。而00选两个0会造成答案\(-2\),不如只选\(1\)0。但是0110如果只选1,对手可以将其改变从而使得答案\(-2\);如果只选0,会造成答案\(-1\),这样还不如把01都选了,这样贡献始终为\(0\)

但是会发现对手最多能交换\(m\)次,所以如果选了\(k\)01中的1而不选0,如果\(k>2\times m\),则答案会多\(k-2\times m\),因为剩下的对手无法变换,没被换的列会让答案\(+1\)。但是也可以把0101都选了,这样对手无法进行变换,对答案的贡献为\(0\)

也就是说我们现在有两种策略:

  1. 如果选了01这种列,则把01都选了。这样00列造成的贡献为\(-1\)(只选一个就可以让序列连通),11列造成的贡献为\(2\)0110列造成的贡献为\(0\)。对于贡献,在整个序列求一个最大子段和就是可能的答案。
  2. 如果对于一些01列我们只选1,这样对手就可以进行变换,每一次答案\(-2\),但是在它变换次数用完后,没被变换的列每一个对答案的贡献为\(+1\)

对于策略\(2\)的最大答案实际就是对于所有01列的贡献记为\(1\),然后将总贡献减去\(2\times m\)即为最终答案。需要用dp求出了。设\(dp_{i,0/1/2}\)表示第\(i\)列 选第一行/选第二行/两行都选 的最大结果。

\(s_i=\)00时则有转移方程:

\[\\dp_{i,0}=\max (dp_{i-1,0}-1)\\ dp_{i,1}=\max (dp_{i-1,1}-1) \]

\(dp_{i,2}\)不转移的原因是不优,没必要两个都取。

\(s_i=\)11时则有转移方程:

\[\\dp_{i,2}=\max (dp_{i-1,0},dp_{i-1,1},dp_{i-1,2})+2 \]

\(s_i=\)10时则有转移方程:

\[\\dp_{i,0}=\max (dp_{i-1,0},dp_{i-1,2})+1\\ dp_{i,1}=\max (dp_{i-1,1},dp_{i-1,2})+1\\ dp_{i,2}=\max (dp_{i-1,0},dp_{i-1,1},dp_{i-1,2}) \]

\(s_i=\)01时则有转移方程:

\[\\dp_{i,1}=\max (dp_{i-1,1},dp_{i-1,2})+1\\ dp_{i,0}=\max (dp_{i-1,0},dp_{i-1,2})+1\\ dp_{i,2}=\max (dp_{i-1,0},dp_{i-1,1},dp_{i-1,2}) \]

则策略\(2\)答案为\((\max_{i=1}^{n}\max(dp_{i,0},dp_{i,1},dp_{i,2}))-2\times m\)

最终答案为两个策略答案的最大值。

时间复杂度\(O(n)\)

T3 youyou 的序列 II

单点修改\(+\)区查想到线段树。

posted @ 2024-12-09 12:01  Twilight_star  阅读(9)  评论(0)    收藏  举报