cf/at/JOISC

CF标的是div2的比赛号(除非是单div1场),div1E=div2G,以此类推。形如F1,F2会被记为F,G。

CF

1647

E

关键一步是可以通过当前在场学生的编号最大值算出变换的步数,进而算出对于每个座位,哪些座位上的人最终会到达它上面。然后对于每个座位,它对应的到达集合中标号最小的座位上一定坐的是最终序列中坐在它上面的人,剩下的字典序贪心即可。

F

官方题解没看懂,但是自己好像yy出了一个,就是用这个的第一题的做法,设 \(f_{i,j}\) 表示前i个元素形成两个上升子序列,其中一个末尾是 \(a_{i}\),另外一个末尾是j的可行性,和之前提到的题目一样转移,中途用可持久化线段树维护历史版本,还要对后缀维护一个同样的东西。然后枚举其中一个最高点(并且是两个最高点中高的那个,便于统计),对两边线段树上小于最高点的值的位置求和(注意这里有细节,不是所有的可行点都可以计入答案,要去掉小于两边最小值中较大的那个的所有位置)。复杂度1个log。

1651

E

一张每个点度数均不超过2的二分图就是一堆环+路径,考虑从所有点中除去不会成为匹配中的点,那么最终结果就是剩下的点数目/2。环和偶数长度路径显然不需要删点,奇数长度路径需要删去一个点。对于每个可能的奇数路径统计出现次数,一个奇数路径存在当且仅当路径上的每个点都在区间中,而路径两边的点不在。

F

考虑一次怪物从前往后走的过程,假设在某个位置怪物死亡,那么塔的序列将变成:
这个位置之前:怪物路过时清零,只有新增的部分
这个位置:减去怪物死亡前的血量
这个位置之后的部分:不影响
如果在每次操作的位置放一个隔板,那么显然两个隔板之间的区间和可以O(1)求出(二维前缀和),如果一次操作怪兽路径覆盖某个隔板,那么这个隔板就不再有意义,可以删去。对于后面未访问过的部分,直接暴力推就行,每个点只会作为“没被访问过的点”访问一次。

1671

E

有一个非常有用的启发:
对于一个可逆的操作,一个状态能达到的极大状态集合与集合内其他状态相同(证明显然),对于不同构的两个状态,前面定义的这个集合交集为空。
对于树上的一个点(显然代表的实质上是一个区间),如果左右子树同构,那么定义节点i表示区间可以通过swap得到的不同字符串的种类个数为 \(f(x),那么有:f(x)=f(ls) \times f(rs) \times (ls与rs同构)?1:2\)
意思是如果同构,那么方案数就是左右乘积,交换无异议;否则交换有意义,要乘2。

F

直接dp合法序列数,令\(dp[i][j][k]\)表示1-i的排列,逆序对个数为j,相邻逆序对个数为k的排列个数,转移枚举i放在1到i-1的排列中的哪个位置。后两维用矩阵乘法维护,再用小Y与奴隶主的经典套路维护答案。

1678

E

相当于若干个环,随意赋值,最小化相邻两个数的距离之和。
先考虑只有一个环,发现,对于偶数长度的环,假如有3个连续的位置满足单调,总能够从通过交换而构造出一个更优的,且这三个位置不单调的方案,所以最终结果一定是类似于山峰-山谷型的,山峰对答案贡献+2,山谷贡献-2,显然把大的数全部放在山峰,小的数放在山谷最优。奇数长度的环,考虑1所在的位置,它的前一个数一定大于它,而它前面的前面的数又一定大于它前面的数(环长是奇数),一定有一个数对答案的贡献是0,其他数和偶数长度环同理。
对于多个环,贪心的把大数放在山峰,小数放在山谷即可。

F

每次冒泡相当于序列非0数字-1,左移一位并在最右端添0,可以得知k次冒泡之后的结果是右边若干个0,左边的每个数分别对应最初序列中的某个数。可以直接简单组合算出最初v序列的可能数量,然后可以发现v和原排列是一一对应的。

1670

E

考虑到答案不可能小于(1<<(p-1)),而样例给出的答案正好是(1<<2),于是尝试去构造一个答案等于(1<<(p-1))的解。
一个合法的解是在根放(1<<(p-1)),然后相邻点随意放大于等于(1<<(p-1))的数字,在后面再放上这个数-(1<<(p-1)),然后在随便放一个小于(1<<(p-1))的数,再放这个数+(1<<(p-1)),剩下的依次类推。

F

转化为前缀。考虑当前这一位能放多少,如果这一位能放的数超过2n,那么后面显然没有限制,可以随意,否则用类似与数位dp的方式处理,令f(i,j)表示当前第i位,能放多少的方案数。复杂度 \(O(n^{2}\log |r|)\)

1712

E

题意是让你求满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数。
我们通常都有一个直观感觉,lcm应该是各数之积级别的,换句话说, 不满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数应该不太多,考虑用总的个数减去不合法的个数。
\(lcm(i,j,k)< i+j+k\) ,因为k是三元组中最大的数,所以 \(lcm(i,j,k)< i+j+k< k+k+k< 3k\)。又由于lcm一定是k的倍数,所以lcm的值只可能是k或者2*k。
1.lcm=k
i,j只要是k的约数即可,对于一组询问,答案为

\[\sum_{i=l}^{r}\binom{i在[l,r]中的约数}{2} \]

初始给每个位置赋初值为约数个数,对询问按照左端点排序,枚举左端点,每枚举一个就把当前枚举值的倍数的约数个数-1,那么询问 \([l,r]\) 就是区间的 \(\binom{a_{i}}{2}\)的和,线段树即可。
这部分 \(O(w\log w)\),其中w是值域=200000。

2.lcm=2k
设k的唯一分解中2的幂次是x,那么lcm=2k相当于要求i和j其中有一个的唯一分解中2的幂次是x+1。
枚举2k的所有约数作为i,如果2k中唯一分解中2的幂次是x+1,那么j只要满足在i和k之间且是2k约数即可。否则j的唯一分解中2的幂次必须是x+1。对于这两种情况都不难统计固定k之后,对于每一个合法的i,有多少个j符合我们设置的条件。这里要枚举1-2w的所有数的约数并存下来,还要对每个数的约数求出作为i的贡献并存下来,时空均是1个log的。
在之前的讨论中没有考虑l的限制,加入l的限制的话,用前缀和差分即可。
和前一种情况类似,对询问按照左端点排序,枚举左端点,每枚举一个左端点t就对t的倍数去掉t作为i对答案的贡献。这里具体实现可以把所有数放进优先队列(关键字为大于t的最小因数),t增加时查询当前堆顶是否有关键字等于t的元素,把t的贡献去除,再把关键字改为下一个约数后放回。快速查询下一个约数可以用链表。

总复杂度 \(O(w\log^{2} w)\)

F

我的做法:
原题等价于建一个虚点向所有叶子连边,边权为 \(\frac{w}{2}\)。求直径。
在加上这些边之后,两点的最短距离只有两种可能,即原树上的简单路径或者在两点的子树中找深度最小的叶子,先到达叶子,然后走新加的边到另一个叶子,再到终点。
考虑点分,先处理过重心的所有路径。
直径可以写成这个样子:

\[ \max_{i,j}(\min(dep(i)+dep(j),dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)-(dep(i)+dep(j))+w)) \]

如果类似于树链剖分一样,选择拥有最浅的叶子的儿子为重儿子,树将被剖成若干条链,其中对于同一条链上所有节点,“子树内深度最小的叶子”相同。那么,对于两个点,如果他们所属的链已经确定, \(\min(dep(i)+dep(j),dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)-(dep(i)+dep(j))+w)\) 就只与 \(dep(i)+dep(j)\) 有关。而且前者随之递增,后者随之递减。而 \(dep(i)+dep(j)\) 的取值范围是 \([dep(i所属链链顶)+dep(j所属链链顶),dep(i所属链链底)+dep(j所属链链底)]\) 如果取不到折点(即 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\)),答案就是 \(dep(i所属链链顶)+dep(j所属链链顶)\) ,否则是\(\frac{dep(i所属链链底)+dep(j所属链链底)+w}{2}\)。判断条件是

\[dep(i所属链链顶)+dep(j所属链链顶)\leq \frac{dep(i所属链链底)+dep(j所属链链底)+w}{2} \]

这等价于

\[(dep(i所属链链顶)-\frac{dep(i所属链链底)}{2})+(dep(j所属链链顶)-\frac{dep(j所属链链底)}{2})\leq \frac{w}{2} \]

把所有剖后的链按照 \(dep(链顶)-\frac{dep(链底)}{2}\) 排序(注意到这里值域是 \(O(n)\) 级别,可以用桶排),那么对于每一条链,一个前缀与它的贡献就是\(dep(i所属链链顶)+dep(j所属链链顶)\),转化为查找前缀最小值。剩下的和它产生的贡献是 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\) ,与前者类似转化为查找后缀最小值。由于不同询问的树形态不变,所以可以先点分,树剖处理完之后枚举每条链的时候,再枚举每个询问的不同的w,对每个询问求出当前链的贡献。
复杂度:点分之后树剖,每条链按照特征值排序之后维护前后缀最小值,再枚举每条链,枚举每个询问,求出链对答案的贡献,复杂度 \(O(nq\log n+nlog^2)\)

CF官方做法:
维护一个数组val(i,j)表示i子树内距离最近叶子距离为j的所有点中深度的最大值。
维护当前的ans值。(这个ans不清楚可以看官方题解,我觉得这个ans的维护方式还是挺妙的。)
val(i)随着j的增加递减:对于一个点x,若其被记入val(?,j),那么一定存在一个儿子k,depth(k)=depth(x)+1,k距离最近叶子距离为j-1。
合并子树时枚举两颗子树的第二维,如果能更新答案则更新答案,否则直接break即可。此时的根节点用同样的方法维护即可。
复杂度的证明等同于长链剖分。
同时枚举两维的部分复杂度正确是因为内层循环不超过n次(每次ans+1,ans不超过n)。

1715

E

普通边用dij转移,特殊边的转移经观察发现是斜率优化。

F

CF的图一看就懂,很妙的构造。

1717

E

枚举c,再枚举gcd(a,b)=gcd(a,n-c-a)。剩下的部分只跟欧拉函数有关,线性筛即可。

F

用网络流模拟分配,一次分配相当于先两边都-1,然后选一边+2。网络流模拟+2过程,图建成后发现想要的是两边均满流,对无限制的所有点建一个虚点,向汇连m-总需求的边,这样最大流就可以保证两边均满流。

1721

E

暴力跳next会T,所以对每个位置维护一个快速转移数组(类似于回文自动机那个不基于势能的构造算法)

F

二分图最大匹配=最小覆盖,每次删去最小覆盖中的一个点。注意此时最小覆盖一定-1,证明的两个不等号分别用定义和反证法完成。由于最小覆盖的点集和最大匹配的边集大小相同,而且每条最大匹配边必然与某个最小覆盖点集中的点相连(最小覆盖定义),且同一个点只会被连一次(最大匹配定义),所以点和边形成双射。在删去点时同时删去边即可。

1720

D2

虽然不等号两边同时异或之后不等号不一定成立,但是可以强行异或之后观察结果,可以发现形如a>bc的形式,其中a和c只与当前位置有关,b是之前的每个位置的本质属性。用01trie维护bc,考虑a和b^c最高的不同位,根据两边同时异或的那个数在当前位的值和当前位两边数的差异可以得出另一侧子树中所有满足b某一位为0/1的值符合题意,每次向trie里面插入 \(a_{i}\)$b_{i}$,再用全局异或维护bc,查询最大值则是把 \(a_{i+1}\) 放在trie上跑,每走一步就判断另一棵子树是否满足题意,是则取出子树中 \(b_{i}\) 当前位为指定值的最大值,这里需要维护子树内 \(b_{i}\) 为指定值的最大值,在插入时维护即可。复杂度 \(O(nlogn)\)

E

先对一个正方形前缀染,然后再对这个前缀的正方形后缀染。正方形后缀的边长增加1,答案的减少值不超过2,而你又可以操控染的颜色,即答案+1或不变,于是值域内所有的值都可以取到。

1726

E

考虑环长只有124三种情况。枚举4的个数,1和2可以直接递推。

G

0.每个数操作后只会增加,每个数的操作都有一个类似于窗口期的东西。

1.最终值是最小的a操作一次的值。

2.当同时有多个值可以操作时,最先操作大的数,相同的数则优先操作类型为1的数,这样可以保证这个数的操作不会影响其他可以操作的数的可操作性。

用一个数据结构维护每个数的可操作性即可。

1728

E

先考虑在确定红辣椒和黑辣椒个数的时候怎么做,假设全部选红,把所有菜按照\(b_i-a_i\)排序。那么最后的结果一定是一段前缀选了黑,其余选红,换句话说,最大收益关于红辣椒个数是凸的。
求出凸点,那么对于每一组询问,都可以快速求出在凸点左边和右边最靠近凸点的解。询问是O(1)的。

F

提出一个结论,即局部最优为全局最优。

证明考虑如果有一个位置没有使用局部最优,那么把当前的局部最优插入当前使用的元素之前,当前元素答案不变,而其他元素的答案不增。
但是可能有多种a_{i}满足全局最优,所以考虑每一次决策都有若干个元素可以选,每次只能且必须选一个,每一个只能选一次,这可以用最大匹配解决,每加入一个点就按照匹配代价从小到大加入边。

cf的题解则是说,观察b数组可得b数组有如下性质:各元素互异,b被a整除。而这个必要条件正好也是充分条件,因为按照b排序后的下标分配a就可以得到一个合法的方案。所以相当于给a和它的倍数找匹配,每个数只能被用一次,二分图带权匹配解决。

然后发现把左右交换之后直接跑匈牙利也是对的,但是匈牙利是 \(O(左部点\times E+右部点)\) 的,在这道题中是4次方的,无法通过。然后在匈牙利中有一个优化:如果没找到增广路就不对vis数组memset为0,这样复杂度变为最大匹配 \(\times\)(点数+边数),最大匹配小于等于min(左部点,右部点)。在这道题中是 \(O(n^3)\) 的,可以通过。

G

考虑如果对于某个特殊点集合一定不满足,其余无所谓的分配的方案数。
预处理两个特殊点如果不满足,中间的灯的方案数,这样可以在 \(O(m^{2}n+2^{m}m)\)完成。
发现这个东西本质上是一个类似于高维后缀和的东西,而最后的询问是枚举最左和最右的未照亮点,询问一个类似于某集合子集的东西,这个的本质是个高维前缀和,所以要先高维后缀和转原数组,然后原数组再求高维后缀和。

1730

E

考虑r从小到大变化,对于不同的l的区间最大值的变化,发现可以用单调栈维护,贡献也可以在单调栈上算,复杂度O(nD+nlogn)。
cf官方题解的做法则是枚举最大值和最小值,求合法的区间。

F

令dp(i,S)表示当前最小的未放置的数是i,i-i+k的放置状态是S,的最小逆序对数。当最小的未放置数是i时,大于i+k一定未放置,小于i的一定已放置,暴力记录状态后逆序对不难算。
很妙的是这个dp不是显式地在p上dp,而是用了"当前最小的未放置的数是i"这一状态定义,同时解决了状态转移无环和逆序对的计算。

1733

D2

只考虑x<=y。
几个显然且有用的性质:
代价随着长度单调不降
一个点只能被匹配两次,同一个点作为r只能被匹配一次
这样n^2dp就出来了:令(i,j)表示,前i个位置,还有j个1未匹配的方案数,还要再开一个01维表示当前位是0/1,转移枚举i和之前的谁一起操作一次即可(如果需要操作的话)。
线性dp则是考虑到,每次操作都会操作在1上,不存在交叉的匹配,也不存在不相邻的两个数用若干次x匹配,那么令f(i)表示前i个数的匹配的最小代价考虑第i个数的匹配,可能和之前的用y匹配,也可能和相邻的用若干次x匹配。
还是蛮妙的,我还推出来一个性质:存在一个方案使得,大于临界值(用x和用y代价相同的区间长度)的区间都是互相嵌套的。

1734

F

结论:\(S_{i}\) 为1当且仅当i的二进制有奇数个1。
问题变成了对于 \(x\in [0,m-1]\),有多少个 \(x\) 满足 \(x+n\)\(x\) 的二进制中1的个数和为奇数。
数位dp即可。复杂度 \(O(log^{2}n)\)

1735

E

考虑 \(p_{2}-p_{1}\) 只有 \(2n\) 种可能。枚举这 \(2n\) 中可能,对于大于枚举值的 \(d\),它一定和一个 \(d-\) 枚举值的 \(d\) 匹配,匹配完之后剩下的都是在两点之间,互相匹配即可。

F

\((p,q)\) 看成点,放在二维平面上,初始是 \((0,0)\)\((p,q)\) 形成的矩形。每次操作相当于沿着 \((p_{i},-q_{i})\) 向量平移,可以发现图形始终是凸包。暴力平移是 $O(n^{2}) $的,但是考虑平移不影响相对关系,那么维护边的长度和角度即可。每次就是插入一条边,维护和两个坐标轴的交点,然后再切掉不在第一象限的部分。

1739

F

存在一个keyboard能构造出某个串意味着按照相邻字符连边之后,图的形态是一条链加若干个孤立点。这又等价于链表示的字符串或者它的reverse在keyboard中出现过。
然后两个结论:串和反串在同一个keyboard中的出现次数之和不超过1,所以可以把权值赋到字符串上,一个keyboard的权值等于包含的关键子串权值之和。状压使用过的字符集之后在AC自动机上跑DP即可。

1762

E

想了半天才反应过来 \(d(1,n)\) 其实只有代表意义,相当于求两两路径权值之和,等价于对每条边,求它对答案的贡献次数之和和自身权值之积的总和。
把一棵树中所有点的题目限制中的等式乘起来发现,枚举边的权值=-1的两边siz次方,算贡献次数就是两边siz的乘积乘上两个有标号有根树的数量,记得乘一个组合数分配标号。

F

先考虑没有绝对值怎么做,对于每个数x找到后面第一个比自己大的数y,这个数的答案就是y的答案加上后缀中值域在 \([x,y-1]\) 内的数。
现在有绝对值,考虑到虽然路径可以上下起伏,但是一定存在一条路径是单调的,只考虑没有绝对值的答案正反做两遍即可。

1767

E

翻转题目,先把所有颜色选上,考虑最大化能放弃的颜色的权值。
题目要求等价于,对于相邻的元素,若不同色,则在这两个颜色之间连边,若同色,则这种颜色必须选择。最后在颜色构成的图上求一个最大权独立集。
把点分成两部,内部分别求最大权独立集,枚举左部点的集合,合法的右部点集合是一个集合的子集,fwt维护高维前缀max即可。

1787

D

从i向 \(i+a_{i}\) 连边,那么图是基环树和树构成的森林。考虑1所在的基环树/树,对路径上的点计算方案数(其他的只与1是否在树内有关,有则是2n+1,否则0)。
1.直接连向[1,n]以外,方案数是n+1。
2.连向一个树,方案数是其他树的siz和。
3.如果1在树内,那么连向非1子树的树部分也可以。
要统计的是每个点所属的树,各个树的siz,各个点的子树siz。
代码学习记录

E

因为两个集合可以合并,那么问题等价于构造尽量多的集合。直观告诉我们让a和a xor x匹配最优。而事实上也是这样的,多余的部分统一放到一个集合里即可。
证明:考虑x的最高位,这一位上为1的数字在[1,n]中有m个,那么 \(ans\leq m\)。把这些数字拿出来,它们异或上x之后一定会变小,一定可以在[1,n]找到自己的匹配。

F

G

H

I

1797

D

小小的难点在于实现,如果赋值之间互相有影响可以先拷贝一份再赋值。

E

结论是 \(\varphi\) 树高度很小,用线段树维护区间dfn最值,区间深度和即可。

F

1810

F

简单思考可以知道合法当且仅当 \(\sum m^{a_{i}}\leq m^{x}\)。线段树维护m进制数即可。

G

1816

B

首先考虑一个点对最终结果的贡献的正负性只与他的坐标的奇偶性有关。那么一定把大的放在正格子上。同理一定把 \(2n\)\(2n-1\) 放在起终点上。然后考虑必要条件,先关注走右上边缘和左下边缘的路径,和是定值,那么最小值的上界是和的一半。感性上来想,我们希望最小值越大,最好一定是所有值相等,但是做不到,那么转而希望波动最小,相邻两条路径的变动就是两个元素,那么让这两个元素的差最小即可。构造1和2,3和4...n-1和n分别占据一对右上-左下格子。严格计算可得这确实是最优解。

D

发现操作 + n+1+ n+2,刚好图是一条链。

E

因为1是特殊的,先考虑限制了两个数中间必须有1的情况。发现这种时候这些数肯定不超过两个,且一定是把这些数放在1的两边。扩展一下,把关系看成一条边,每个数就会有一个不能超过到1的最短距离的限制(这里不需要关心是不是dag,到1的最短距离在一般图上是可以定义的)。构造就是依次放dis为1,2,3...同一种的一起放且在每个位置的相对顺序一样。这样可以论证是正确的。proof见这里。手玩一下可以发现是有规律的,按规律输出即可。规律也请参考proof的链接。

F

首先 \(m\neq 2\) 的话答案是简单的。考虑m=2,从低位往高位dp下面的部分这里讲得很好,就直接截图了。
img
img
还有另外一种拆贡献的做法,感觉是异曲同工。拆贡献的做法要枚举两边的方案数,这个只需要枚举一边,另一边放在转移路径中计算了。

1844

E

考虑每个 \(2\times 2\),需要选一个对角线相同。设左上-右下方向的对角线为0,反之则为1。则有每个\(3\times 3\)中四个对角线的异或和为0。设第一行和第一列的值为 \(a_{i},b_{j}\),有 \(val_{i,j}=a_{1,1} xor a_{1,i} xor a_{j,1}\),限制相当于某个val为0/1,\(a_{1,1}\) 不影响这个异或线性方程组方程组是否有解,相当于限定某两个点同色/异色,询问能否黑白染色,dfs即可。

代码学习记录

1853

E

如果没有+K这个操作的话,就是noip2018D1T1积木大赛。考虑对于操作后的序列,答案就是\(\sum max(d_{i},0)\)

重要的发现:\(-K\leq d_{i}\leq K\)

证明:如果 \(d_{i}\geq K\),那么让 \(a_{i}-=K\),答案一定不劣。

那么就变成了每个 \(d_{i}\) 只有两种取值,一个 \(\le 0\),一个 \(\geq 0\),要求 \(d_{i}\) 的前缀和 \(\geq 0\)

反悔贪心即可,每次把一个负值改为正值会使得前缀和+K,一定能使前缀和为正,所以每次取转正代价最小的位置即可。

1858

E2

先想没有回退操作怎么做,维护数组 \(b\) 表示,\(b_{i}=1\) 当且仅当 \(a_{i}\) 的数字是第一次出现。同时维护当前的 \(a\) 的长度 \(x\),删除末尾 \(k\) 个数就是 \(x-=k\),加一个数就是 \(x++\),查询之前有没有出现过 \(a_{x}\),可以用set对每一种值维护出现的位置,就变成了在set中lowerbound。加入回退操作,由于删除末尾 \(k\) 个数不改变 \(b\) 数组的值,末尾添加一个数只会改变一个位置的值,可持久化数组维护 \(b\) 即可,每次的答案就是 \(b\) 的前 \(x\) 个元素的前缀和。

1859

E

把题目的目标形式化的表达出来:

\[ \max_{[l_{1},r_{1}],[l_{2},r_{2}]...互不相交}\sum |b_{l_{i}}-a_{r_{i}}|+|b_{r_{i}}-a_{l_{i}}|\\ =\max_{[l_{1},r_{1}],[l_{2},r_{2}]...互不相交}\sum max(b_{l_{i}}-a_{r_{i}},-b_{l_{i}}+a_{r_{i}})+max(b_{r_{i}}-a_{l_{i}},-b_{r_{i}}+a_{l_{i}})(绝对值定义)\\ =\max_{[l_{1},r_{1}],[l_{2},r_{2}]...互不相交}\sum max(两个绝对值的四种拆开情况的对应和)\quad (加法对max的分配律)\\ =\max_{[l_{1},r_{1}],[l_{2},r_{2}]...互不相交}max(所有区间任意标符号的权值和)\quad (加法对max的分配律)\\ =\max_{[l_{1},r_{1}],[l_{2},r_{2}]...互不相交}所有区间任意标符号的权值和\quad (删去max的重复嵌套)\\ \]

要求互不相交,每个区间的权值只与端点有关,可以设计 \(dp_{i,0/1/2/3/4}\) 表示前i个数,之前没有/有且符号种类为1/2/3/4的最优解,转移显然。

F

首先升级次数不超过log,其次在确定要学车多少次之后,学车一定是在第一次到达能学车的点就学到期望的级别。
考虑最终的结果一定是在a到b路径上的某一点离开去找地方学车,再径直奔向b,那么枚举离开的点x,答案就是一个常数+一个只跟x有关的变量(具体看cf题解,这里懒得推了),对于每一种可能的级别维护这个变量,询问就是查询链上最小值,复杂度两个log。

1860

E

考虑所有间隔向所属的{前一个字符,后一个字符}连长度为0的边,字母二元组再向所有前后为对应字符的位置连1的边,答案就是这张图的最短路。考虑两个位置的最短距离,如果不经过字符二元组代表的点,就是 \(|j-i|\),否则枚举第一个经过的点,答案就是\(dis(x,i)+dis(x,j)\) ,所有x到其他点的最短路可以直接01bfs求,复杂度 \(O(|\sum|^{2}n)\)

F

考虑直线与x轴夹角增大的过程中,顺序只会改变 \(O(n^{2})\) 次。每次是交换一对括号,相当于区间 \(+1/-1\),查询全局最小值,线段树即可。

1863

G

考虑连出排列的基环内向树,观察一次操作,发现是让 \(fa_{x}\) 变成自环,然后 \(x\) 指向 \(fa_{fa_{x}}\)
这等价于初始将所有边置为轻边,一次操作将重链链顶的父亲的重儿子定为重链链顶(如果此时重链链顶的父亲没有重儿子),这样一来非链底的点都是自环,一个点在操作完之后的前驱就是链顶的父亲。构造过程同时说明了这个轻重边的状态和排列的状态是一一对应的,所以可以在轻重边状态上计数。注意这里主要考虑的是树,环上是有问题的,下面仔细介绍。

那么树部分的答案显然是 \(\prod son\_ num_{i}+1\)。再考虑环,环上有一个问题,就是如果已经有环长-1条边被置为重边,那么环上就已经全部变为自环了。这样就会算重。那么把这些状态减掉,答案就是:

\[(\prod_{i\in cycle}(in_{i}+1)-(\sum_{i\in cycle}in_{i}-1)-1)\times \prod_{i\in cycle}(son\_ num_{i}+1) \]

其中in是入度,第一个-1是恰有一条边不是重边的方案本来应该算一次,但是算了 \(\sum_{i\in cycle}in_{i}\) 次,所以要减
\(\sum_{i\in cycle}in_{i}-1\),第二个-1是全部是重边的方案也要-1。

1864

F

考虑调整法证明最优解的第一步是全局-=L,之后就是对于每个全部非0段递归。然后就可以知道对于一个询问,ans=R-L+1-(相邻的且中间没有[L,R]中更小元素的相同元素对) ,把这样的对对答案的贡献在2D上扫描线维护。

G

几个引理:

  • 一个数所在的行被操作之后,这个数一定在正确的列上,列同理。称这样的行和列是合法行和合法列。

因为一个数只能操作两次,所以一个数的行只能改变一次,列只能改变一次。

  • 不存在两个数偏移量相同等价于如果行和列都有操作过,那么不存在两行的偏移量相同且均大于0,列同理。

证明是互证推导。更具体的证明可见洛谷题解区中Alex_wei的证明

  • 如果同时存在行和列合法,那么无解。

如果第 \(i\) 行和第 \(j\) 列合法,那么在 \(a_{i,j}\) 上可以证明违反第二条引理。

所以答案一定是先有若干合法行,用掉,产生若干合法列,再循环。

H

先考虑怎么算。设 \(i\) 期望被经过的次数为 \(f_{i}\),那么有:

\[f_{i}= \left\{ \begin{array}{} f_{i-1}+f_{\frac{i}{2}} \qquad 2|i \\ f_{i-1} \qquad else \end{array} \right. \\ \]

然后发现只要在矩阵中记录所有 \(f_{\frac{i}{2^{k}}}\),就能保证信息封闭。并且转移矩阵只与 \(i\) 的后缀0个数有关。

1868

E

大概学了个思路,感觉不会写转移。
给序列 \(a_{i}\)

你要找一个大小为k的划分,令 \(s_{i}\) 为划分后每一段的和,对于任意 \(1\leq i\leq j\leq n\) 满足:

\[ \min_{i\le k\le j} s_k \le \sum_{k=i}^j s_k \le \max_{i\le k\le j} s_k \]

现在询问你一个最大 \(k\) 满足存在一个合法的 \(k\) 个区间的划分。

令划分完之后在s的序列上的前缀和为S。考虑S最大和最小的两个位置,将这两个位置选为i,j,做差的结果一定是全局极值。那么一侧一定满足,另一侧的限制就是存在两个相邻的元素使得他们的差也是对应极值。这告诉我们一定存在一对极值相邻。
枚举这对极值,s就被分成了两部分。如果可以证明“两部分分别符合条件 \(\rightarrow\) 整个数组符合条件”那就太好了,幸运的是这是对的。

证明部分请移步 这里,我是看了这篇题解才学会的。

然后就是经典区间dp模型。\(f_{i,j,l,r}\) 表示区间[i,j],取值范围是[l,r],最多能划分的段数。暴力做是6方的。

转移就是枚举两个极值。

考虑优化,第一个优化是发现除了整个段,l,r中的一个一定取到 \(S_{i}\)\(S_{j}\)

第二个优化是基于第一个优化,由于l,r中的一个一定取到 \(S_{i}\)\(S_{j}\),那么转移的时候枚举的两个极值,其中一个一定是 \(S_{i}\)\(S_{j}\) 中对应的一个(否则取到的那个 \(S_{i}\) 将脱离值域)。那么只需要枚举另一个。

1870

E

考虑对于固定的右端点r,所有左端点的MEX的情况,在MEX变化的位置插上隔板。当r变成r+1时,变化是:去掉至多一个隔板,插入若干个隔板。在暴力dp的基础上,如果每次只暴力转移

\[MEX(i,j)!=MEX(i+1,j)且MEX(i,j)!=MEX(i,j-1) \]

的区间 (显然由题目限制,只转移这些仍然可以得到最优解,换句话说,一定存在一个最优解满足选择的每个区间都满足如上性质)。那么每个右端点的暴力转移次数就是新插入的隔板数+常数。每次至多拿走一个隔板,根据势能分析可得暴力转移次数是线性的。

F

首先,相同长度的所有数字在按照新的规则排序之后一定有序,那么所有相同长度的数字中满足题意的一定是一个区间。

proof:\(rank_{i} > rank_{j} \rightarrow rank_{i}-i \geq rank_{j}-j\)

那么变成了要快速求某个数的 \(rank\),之后就可以对每种长度二分即可。

对于每个数的 \(rank\),枚举所有的长度种类i,发现比当前数 \(x\) 小的数的个数就是 \(x-k^{i}+(len_{x}\geq i)\)。如果 \(i > len_{x}\),那么在x后面补0直至补齐。

复杂度 \(3\)\(\log\)

1872

F

显然图是一个内向基环树森林,如果环是自环那么显然可以安排顺序使得每一个的取值都是 \(2a_{i}\)。环上必须放弃一个,那么答案就是所有点权和的2倍-每个环上的min。

G

注意到对于固定的右端点,向前枚举log个不为1的位置后,之后的位置一定比选最靠前的不为1的位置劣。

1876

C

首先连边 \((i,a_{i})\)。这是一个内向基环树森林。因为对于未被删的元素集合,只要被删的下标集合恰好等于它,那么就可以合理安排顺序构造解。就变成了:如果要选一个点,那么它的前驱必须不选,如果不选一个点,那么至少有一个以他为前驱的点选了。
在内向基环树森林上考虑,首先考虑叶子,显然叶子不能不选,这也会导致他的前驱必须不选。于是我们对每棵基环树剥叶子,最后会得到若干环,其中要求某些点不选。对于环上两个相邻的被限制的点之间的部分,黑白间隔染色即可。无解仅当环是自环且无法选/环长是偶数且没有在剥叶子时强制选的点。

D

题目等价于算等于的方案数,因为大于的方案和小于的方案可以构造双射。简单与处理后可以知道哪两个元素会匹配,发现匹配不能有包含关系。每个匹配只有两种情况:先分配给A/B。如果两个匹配相交,那么这两个匹配的分配情况相同(否则一定不想通风),属于同一个val的所有匹配的分配情况也相同。那么对每种val开一个点,把相交的匹配对应的val连边,等于的方案就是连通块数。

1878

G

发现g函数从 \(x\)\(lca(x,y)\) 只会变化 \(\log w\) 次。讨论 \(x\)\(lca(x,y)\) 的相对位置关系。
发现只需要找到形如某点最近的 \(a\) 值某位为1的祖先。这个可以随便维护一下。
一次询问要枚举这些变化位置,然后对每个这些位置用st表求g。复杂度2个log。

1879

E

考虑先给树黑白染色,这种做法只会在链上挂,那么改为在链上1,2,3,1,2,3...染色,这样就知道一定可以在3种颜色以内完成。
再考虑能不能用两种颜色,根的每个子树是独立的,分开考虑。对于每棵树上的裸链,如果长度大于2则不可能,否则需要所有长度为2的裸链的深度的奇偶性相同。

F

先计算出每个英雄能撑多久,显然是 \(h_{i}\times \lceil\frac{a_{i}}{x}\rceil\)
枚举x,那么可以整除分块考虑每个块,每个块只关心最值和次最值。
最值和次最值可以用st表实现预处理后 \(O(1)\) 查。
复杂度是 \(O(\sum \frac{n}{i})\)=一个log。

1882

E1

首先只考虑一个排列,把它在线性次数内换对是容易的,可以参考cf题解的实现,但是不唯一。
然后可以对同一个数字操作两次,排列不变。
如果排列的长度是奇数,那么操作长度次开头,排列不变。所以一定存在一个足够大的N,使得 \(\forall n>N\),两个排列都可以通过N次交换换对。
否则两个排列的长度都是偶数,套路性的考虑逆序对数,发现每次交换逆序对的奇偶性都会变化。
proof:考虑AxB形式,操作x。变换的是A,x,B之间的逆序对,而且这些变换的部分变化前后的逆序对和是 \(len(A)\times len(B)+len(A)+len(B)\)。这个数字根据驾驶可以推得 \(\pmod 2=1\)。所以变化前后奇偶性不同。
那么如果两个排列奇偶性不同则输出NO,相同则分别找一个合法方案即可。

E2

我也不知道这种玩意是咋想到的。

在开头补一个0,这个0是标识符不参与操作的交换。再把排列看成环,那么就有了循环移位之间互相等价。

考虑一次操作:\(0AxB \rightarrow 0BxA = xA0B\),本质上是交换了0和x。现在我们的操作就变得十分简洁:交换0和一个数,而不是转化前题目描述的那么花里胡哨。

可以知道一个排列上,如果操作是交换一个指定数(这里是0)和另外一个任意数,那么换对的最小操作次数是(指定数所在的环siz-1)+ (其他所有环的siz+1)。证明就是先解决指定数自己所在的环,然后再去解决别的环,感觉这样构造应该是显然最小的,证明懒得证了。

然后因为所有的循环移位等价,那么枚举所有的循环移位,重标号之后数环即可。

再考虑两个排列之间怎么协调。由于:

  • 枚举终态之后排列的奇偶性确定
  • 交换任意两个元素,排列的奇偶性改变。
  • 可以执行两次无用操作

所以只要记录最小的奇数变化次数和偶数变化次数即可。

1909

F

因为一个p可以映射到一个a,所以数一个含-1的a对应的p的个数就是先数所有合法的a序列,再对这些a序列求所有合法p序列的和。形式化一下:

\[ans=\sum_{a}\sum_{p可以生成a} 1 \]

先考虑一个不含-1的序列怎么计数,发现很简单,因为 \(a_{i}-a_{i-1}\leq 2\),0,1,2分别对应了在平面中的一个L形选择0,1,2个。可选择的行数和列数就是 \(i-a_{i}\)

对于含-1的序列,把-1放在一起考虑即可,具体请参考官解,这题和官解想的一样。

1913

F

想法就是考虑操作的种数不算太多,那么计算每种操作的贡献即可。令 \(f_{i,j}\) 表示i位置改成j的贡献,发现对于一个回文中心,贡献的分布形如区间加等差数列和单点加。维护d数组即可。

1918

F不会,cf官方的题解感觉证的很奇怪,只说了调整的方法但是似乎没有论证每一步调整都不会使答案变劣。

G

两种构造方法:
1.发现 a,-b,-a-b,-a,b,a+b 是一个可以无限循环而且合法的结构。然后只需要讨论两边的边角应该放什么即可。感觉后面的构造思维难度和量都很大。
2.发现只要末尾两个元素不同,那么在末尾添上两个元素是可行的:a,b->a,b,-b,a-b。只要论证

\[a\neq 0,b\neq 0,a\neq b\rightarrow -b\neq 0,a-b\neq 0,-b\neq a-b $$。 那么只需要针对奇数和偶数分别找到最小的可行的n,构造解即可。 <span id="1919"> ## 1919 </span> ### D 考虑如何生成一个合法的序列,发现可以拿出一个数x,变成一对相邻的x和x+1。 那么对于给定的终态,我们倒着消即可。先消最大值a,因为最大值不会对消其他值做贡献。找一个相邻的a-1即可。 发现这个就是求前/后面第一个比自己小的数有没有自己-1,单调栈即可。 ### E 经典插入计数dp,从小往大查。发现要记录的是i-1形成了多少个连续段以及左右两端是不是i-1的连续段。 ### F ## cf1923 ### F 因为交换操作可以提前,那么操作序列可以调整成先交换再翻转。显然>2次的翻转是无效的。简单思考可以发现,2次翻转也一定是不优的,这一次不如拿来缩小长度。那么讨论翻转0/1次。0次显然,对于1次的情况,发现最优解就是在保证长度最短的前提下,反串字典序最小的后缀(证明:如果两个串A,B满足 $A\leq B$,那么把靠后的若干0补齐后仍然有$A'\leq B'$)。 <span id="1928"> ## 1928 </span> ### E 首先发现操作不改变 $x$ mod $y$,那么枚举第一次2操作的位置,问题就变成了:能否构造一个序列 $a$,$a_{i}=0/a_{i-1}+1$,$\sum a$为给定值。发现序列由若干 {$0,1,2,3..n$} 构成,且因为有单独的0存在,只要构造最短的 $a$,剩下的补0即可。每一个长度为i的 {$0,1,2,3..n$} 对应一个 $(i,\frac{i\times (i+1)}{2})$ 的物品,做背包即可。 ### F 一个重要的观察:如果相邻的两个数相同,那么一定有两个数相等,所以一个子正方形合法当且仅当把相邻相同看成隔板,那么子正方形中没有隔板,或者等价的说,子矩形完全在隔板隔出的子矩形内。 一次区间加只会插入/删除常数个隔板,一个隔板隔出的子矩形内的贡献是讨论长宽大小关系后是关于长和宽的低次多项式,直接用值域线段树维护两个方向上的隔板大小。隔板有变化时直接查询贡献并删除/加入即可。 <span id="1929"> ## 1929 </span> ### E 因为选择的每个点都必须有贡献,那么选择的点数不超过k,以及只有虚树上的边才有用,所以可选择的范围也是O(k)的。 ### F 把二叉搜索树按照dfs序拍平之后就是课本例题级的计数。 ## cf1930 ### D 数据范围告诉我们肯定是对于一个串有什么性质可以快速判定答案,但是寻找未果,只能先把d1写了,写完d1发现d1的dp本质上只有3种状态,向前dp的过程就是在这3种状态里面打转,维护处于1/2/3状态的起点数即可。 ### E 想想一个删除的下标序列要满足什么条件才合法。想到一个构造就是每k个划成一块,一共2x块(x是操作次数)。i块和n+i块匹配,这样只要第k个和第(2x-1)k个之间有一个数没有被删除,作为操作的中间数即可。发现这也是必要的。然后就是简单组合数。 ### F \]

\begin{aligned}
f(b)&=max_{x}(max_{i}(b_{i}|x)-min_{i}(b_{i}|x))\
&=max_{i,j,x}(b_{i}|x-b_{j}|x)
\end{aligned}

\[对固定的 $i$, $j$ 考察 $x$ 的最优取值,对于特定的位: | $b_{i}$ | $b_{j}$ | $x$ | $val$ | |-------|-------|-------|-------| | 0 | 0 | 0 | 0 | | 0 | 1 | 1 | 0 | | 1 | 0 | 0 | 1 | | 1 | 1 | 0 | 0 | 可以发现答案是 $b_{i}-(b_{i}\& b_{j})=(b_{i}|b_{j})-b_{j}$。 新加入一个数时,分别考虑其作为 $b_{i}$ 和 $b_{j}$ 的贡献。发现最后要解决的问题是形如求 $a_{i}|x$ 的最大值。那么直接维护 $f_{x}$ 表示是否存在 $x$ 的超集。插入一个数就给所有子集打标记。状态数只有 $O(2^{n})$。对于已经打过的位置不再递归,暴力打标记就可以做到 $O(n2^{n})$。 ### G 沿用E的想法,钦定一个序列,看看需要满足什么条件才能合法。对于钦定的序列 $a$,考察相邻两项 $a_{i},a_{i+1}$(设两者的 LCA 是 $d$): + $1$ 到 $a_{i+1}$ 的路径上, $a_{i+1}$ 是最大的元素。 + 如果 $d\neq i$,$d$ 的 $a_{i}$ 方向的儿子的子树 max 是 $a_{i}$。 + $1$ 到 $a_{i+1}$ 的路径上,$a_{i}$ 大于除 $a_{i+1}$ 的任何值。 因为序列是递增的,所以设 $f_{i}$ 表示树上从 $1$ dfs 到 $i$,以 $i$ 结尾的合法前缀个数。枚举 $1$ 到 $n$,那么转移到 $i$ 的 $j$ 就是满足一下条件的 $j$: + $j<i$ + j是i的祖先,或者j是i某个祖先的任意儿子的子树最大值。 + $j>$ $1$ 到 $i$ 路径上除 $i$ 外的最大值。 直接做是 $O(n^{2})$ 的。因为对于每个点都是暴力找它的所有祖先累加。 后一步有点妙。对于一个点u和两个儿子v1,v2,如果子树最大值 $smax_{v1}>smax_{v2}$,那么 dfs 的时候先访问 v1 后再访问 v2 的时候不会向答案添加新元素。那么我们对每个节点的儿子按照 smax 排序,然后固定按照顺序dfs,但是可以跳过一些儿子。这样在数答案的时候是完全等价的。那么之前我们是按照值的顺序转移的,现在我们按照这个钦定的dfs序转移,因为是dfs序,所以维护祖先及其相关信息是非常方便的。相当于这个dp的转移有两个偏序,一个是值的偏序,因为最大前缀序列单增;另一个则是我们构造的这种顺序,而我们构造的这种顺序在维护信息上更方便。 ## cf1936 ### C 先随便询问3个角,然后用一次查询来找到那个位置是正确的。 ### D + n < m:-1 + n的最高位和m相同:找到第一个不同的位,这一位之前异或两者都相同的数,这一位异或1,后面的位异或使得之后全变相同 + 不同:如果n的第2个1在m的第1个1前面,那么构造y=n-n的第2个1+后面全补成1。否则-1。 ### E 感觉cf的博弈题更注重于如何找到必胜必败的等价条件。 发现1个1必败,两个1必胜,那么猜测奇数必败。证明:偶数可以拆成最高位和n-最高位。都是奇数,奇数一定只能拆成一个奇数和一个偶数。 ### F 首先发现如果 (a,b,c) 满足 $\gcd (a,b,c)=\gcd (a,b)=\gcd (b,c)=\gcd(a,c)$,那么操作之后可以用长度 =2 的子序列构造出原来的a,b,c,我们称这种三元组为tuple。以及我们可以不用考虑 $\leq \frac{n}{2}$ 的元素,因为如果大于的值都构造出来了,那么小于的值和对应的$\geq \frac{n}{2}$ 的元素求个gcd就能构造出来。 本题有两种做法,一种是从大到小每12个一组构造4个tuple。讨论第1个数mod4的大小,分别给出对应的构造。最后对 $\leq 13$ 的n手玩构造。 另一种是把tuple的限制缩小成要求两两互质。从大往小构造,如果开头x是奇数就直接选连着三个,否则第1个(x)和第3个(x+2)有一个不是4的倍数,将这一个/2之后替换原数。这样发现4个数都可以构造。最后讨论边界,mod 3=2则选择(1,n-1,n),mod 3=1则选择(1,n,一个未操作的和n互质的数),虽然不知道怎么证这个“一个未操作的和n互质的数” 是否一定存在,但是确实是存在的(proved by AC)。 ## cf1937 ### D 手玩一下题目所述流程就知道要算的是一个和左边的'>'和右边的'<'有关的东西。列一下式子可以发现只需要统计区间两种符号的个数和和下标和即可,前缀和预处理即可。 ### E 直接建边是 $O(n^{2}m)$ 的。发现按值开虚点然后前缀和连边可以做到 $O(nm)$ 条边。 ### F 线段树维护区间答案,区间每个bit的第一次和最后一次出现位置。因为只有单点修改所以只需要考虑push_up。 \]

ans=min(ansl,ansr,跨过中点的区间的贡献)

\[跨过中点的贡献如何计算?枚举第一个大于v的bit,那么就得到了一个新限制,形如 $l\leq X$ 或 $r\geq Y$。如果 $max(a_{X},a_{X+1}...a_{mid})\leq max(a_{mid+1},a_{mid+2}...a_{Y})$,那么贪心的想,一定会选左边,然后答案的一种可能性就是在满足前面的位的情况下的结果和 $max(a_{X},a_{X+1}...a_{mid})$ 取max,答案对这个值取min。这样可以在 $\log V$的的时间内完成push_up,甚至更惊喜的发现,这个合并也可以用于任意两个相邻的闭区间,那么query的时候也可以合并了。复杂度 $O(n\log n \log V)$。 # atcoder # JOISC | <div style="width:55px">$年份$</div> | <div style="width:55px">$day1A$</div> | <div style="width:55px">$day1B$</div> | <div style="width:55px">$day1C$</div> | <div style="width:55px">$day2A$</div> | <div style="width:55px">$day2B$</div> | <div style="width:55px">$day2C$</div> | <div style="width:55px">$day3A$</div> | <div style="width:55px">$day3B$</div> | <div style="width:55px">$day3C$</div> | <div style="width:55px">$day4A$</div> | <div style="width:55px">$day4B$</div> | <div style="width:55px">$day4C$</div> | | :--- | :--- | :--- | :--- | :--- | :--- | :--- |:--- | :--- | :--- | :--- | :--- | :--- | | [2023](#JOISC2023) | | | | | | | | | | | $\checkmark$ | | | | | | # 洛谷月赛 | <div style="width:55px">$场次$</div> | <div style="width:55px">$A$</div> | <div style="width:55px">$B$</div> | <div style="width:55px">$C$</div> | <div style="width:55px">$D$</div> | <div style="width:55px">$E$</div> | <div style="width:55px">$F$</div> | | :--- | :--- | :--- | :--- | :--- | :--- | :--- | | [2024.2(2)](#洛谷2024.2(2)) | | | | | | | | [2023.6(1)](#洛谷2023.6(1)) | | | | | $\checkmark$ | | <span id="洛谷2024.2(2)"> ## 2024.2(2) </span> ## 2024洛谷二月月赛2 ### D 先对同色连通块缩点。如果颜色对 $(x,y)$ 中 $x$ 和 $y$ 没有边相连,那么答案就是两者分别之和,如果有,这样的对数不超过线性。枚举所有的这样的对,对对应的边合并,计算新的权值,提前存下来。并查集写路径压缩+按秩合并可以做到线性。 ### E 首先一眼四边形不等式,有单调性和凸性。但是对每个$k$ wqs 仍然是不可接受的。 接下来的分析复制自云浅的官方题解,略有改动,在此表示感谢。 当 wqs二分的权值 $c$ 过大时,切点就会很小。 我们可以具体分析一下,设 $F(k)=dp_{*,k},D(k)=F(k)-F(k-1)$,因为 $F$ 是凸函数,所以 $D(k)\geq D(k+1)$ 恒成立。 同时,因为 $F(k)\leq n$(考虑 $F(k)$ 的实际意义),那么有 $(k-1)D(k)\leq \sum_{i=2}^k D(i)\leq F(k)-F(1)\leq n$,即 $D(k)\leq \lfloor\frac{n}{k-1}\rfloor$。 设斜率为 $c$ 时的切点为 $G(c)$ ,那么 $F(G(c)-1)-c\times (G(c)-1)\leq F(G(c))-c \times G(c)$ ,即 $F(G(c))-F(G(c)-1)\geq c$ ,$c\leq D(G(c))\leq \lfloor \frac{n}{G(c)-1}\rfloor $。 我们取阈值 $B$, 对于 $k\leq B$ 的询问,我们可以预处理所有普通 DP 值。 对于 $k>B$ 的询问,根据上面的性质,$G(c)\geq k$ 的 $c$ 满足 $c\leq \lfloor\frac{n}{B} \rfloor$ ,我们预处理这些 $c$ 对应的 DP 值。 都采用线段树优化,单次 DP 都是 $O(n\log n)$,取 $B=\sqrt n$,我们预处理的复杂度是 $O(n\sqrt n\log n)$。 dp的优化我们已经尽力了,接下来看看剩下的线段树能不能优化。 观察一下我们实际需要支持的操作: + 向末尾加入一个数 + 后缀加 $1$ + 求最大值 因为一个值在塞到序列末尾时,如果前一个数不比它大,那么前一个数删除不影响答案,那么可以维护后缀最大值的单调栈。 1是往单调栈塞入一个值;3是求栈底的值;对于2操作,我们可以维护栈中的差分序列,以及用一个并查集维护每一个元素对应的块(比如,一个元素在原数组的下标是5,前一个数在原数组的下标是2,那么块就是[3,5]),这样后缀加就是找加的位置属于哪个块,对应哪个元素,对其差分数组减1,如果减到0l就和前面合并,过程中时刻维护差分数组的和和栈顶的val,栈底的值就是两者之和。 ## 2023洛谷6月月赛1 ### E 比较难理解的是后面对于点双的构造,前面圆方树的部分还是比较好懂的。考虑一个这样的构造:对于dfs树一个点x,在fa(x)和low(x)的list里面加上x,然后从根开始访问,访问一个点之后从左到右依次访问list里面的点。访问顺序就是合法的一组解。这个做法是不会出问题的,归纳证明dfs(x)可以做到访问完子树的同时产生的序列任意前后缀的导出子图都是一个和x/x的祖先连通的连通图。\]

posted @ 2022-03-15 00:56  永无岛  阅读(110)  评论(1编辑  收藏  举报