cf/at/JOISC

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

CF

1599

A

我们总是希望当前的天平两边的差能够接近0,或者说,我们随时可以决定是否翻转大小关系。一种可行的构造是排序之后把奇数位和偶数位分别放在两边。详细的构造见这里

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

1693

C

考虑设 \(f_{x}\) 表示 \(x\)\(n\) 的最短时间。

\[f_{x}=min_{(x,y)}(f_{y}+\sum_{(x,z)}[f_{z}>f_{y}]+1) \]

因为没有负边可以用dij统计,正好dij的确定顺序是f递增,那么每当一个点被更新,\(\sum_{(x,z)}[f_{z}>f_{y}]\) 的值就 \(-1\),更新的时候减一下即可。

1698

F

洛谷高赞题解给了两种构造,感觉那个基于欧拉路的构造很优美但是确实想不到,另外一个正常一些。请配合该题解食用。

考虑按位调整。考虑第一次不同的地方是 \(i\)。 那么 \(a\) 形如 \([x,b,\cdots ]\)\(b\) 形如 \([x,c,\cdots ]\)

如果 \(a\)\([x,b,\cdots c,x]\),那么只要翻转两个 \(x\) 即可。

如果 \(a\)\([x,b,\cdots x,c]\),就想办法把 \(x,c\) 转过来。如果 \(a\)\(b\) 中对应的下表区间(\(a\)\([x,b,\cdots x,c]\))形成的相邻元素无序对集合不同,那么一定存在一个元素 \(y\)\([x,c]\) 之前和之后都出现过(即形如 \([x,b,\cdots ,y, \cdots ,x,c,\cdots ,y,\cdots ]\))。(证明:拿一个在 \(b\) 中该段出现但是没有在 \(a\) 中该段出现的对,如果两个元素有一个在 \(a\) 中出现过,那么这个元素就可以作为 \(y\),否则有两个元素只在 \(b\) 中出现了,找一个对使得是由一个在 \(a\) 中出现的元素和没有在 \(a\) 中出现的元素构成的。那么这个在 \(a\) 中出现的元素就可以作为 \(y\)。)。这时只要翻转这两个 \(y\) 即可转化到 \([x,b,\cdots c,x]\)

那么如果两个集合完全相同怎么办?如果完全相同,那么 \(a\) 中一定出现了至少两次 \(c\)。(证明:\(a\)\(c\) 的出现次数奇偶性是奇,那么 \(b\) 末尾一定是 \(c\)\(b\) 中至少出现了 \(3\) 次。)

第二种构造则是给每个值开一个点,在相邻元素对之间连边。这样序列就是欧拉路,操作就是翻转一个欧拉路上的环。因为操作可逆所以只要证明任意两条路径可以调整成同一个状态就可以了。顺着路径一个一个调整即可。

1709

F

先考虑对于已知的 \(c_{i}\) 怎么求集合的最大大小。放在 01trie 上来看,就是边有容量,然后问从根往下最多能流多少。这样就可以在 trie 树上 dp,记 \(dp_{i,j}\) 表示 \(i\) 子树最大流量为 \(j\) 的方案数。转移就是左右子树卷积,然后惊喜的发现左右子树是等价的(或者说同一层的节点都等价),那么 \(i\) 可以改成层数而不是特定节点。\(O(nk\log k)\)

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\) 或者 \(2k\)

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\) -总需求 的边,这样最大流就可以保证两边均满流。

1720

D2

对这个限制讨论:

\[a_{i} \oplus j < a_{j} \oplus i\\ \]

考虑前 \(k\) 位 相同,第 \(k+1\) 位不同。
对于前 \(k\) 位:

\[a_{i} \oplus i = a_{j} \oplus j \]

\(k+1\) 位不同:

讨论 \(a_{i}\) 在第 \(k+1\) 位上的值。

\(1\)\(j\) 这一位为 \(1\)\(a_{i}\oplus i\oplus a_{j}\oplus j=1\)

\(0\)\(j\) 这一位为 \(0\)\(a_{i}\oplus i\oplus a_{j}\oplus j=1\)

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即可。

1783

F

一个排列的话答案显然是 n-环数。每个环有一个点可以不选。转而考虑最大的可以不选的点的个数,每个环只有一个点可以不选,建一张二分图,两边的点表示环,对于每个点,在其所属的两个环之间连边,最大匹配就是答案。

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)。证明就是先解决指定数自己所在的环,然后再去解决别的环,感觉这样构造应该是显然最小的,证明懒得证了。

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

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

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

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

1886

F

首先一定存在一个最优解是“密”的,也就是不存在一个时间啥也不干。
考虑全过程会长成什么样。一定是先破坏所有的1,3类摄像头和部分2类摄像头(阶段1),然后偷走第一颗钻石,然后破坏所有还没破坏的2,3类摄像头(阶段2),最后偷走第2颗钻石。
发现3和2需要决策,那么枚举3和2在阶段2破坏了多少个,这样就知道了数量相关所有的信息,只要判断是否合法。
已知会有多少个2类摄像头在阶段2被破坏,一定是把破坏时间长的安排到阶段1,但是对于1类摄像头情况会更复杂一点。
先给出结论:对3类摄像头按照 \(s_{i}\) 从小到大排序,能放在阶段1就放在阶段1。
为什么?考虑调整法,最优解和贪心解的第一个不同的位置是i。那么i一定在最优解没放进去,并且在贪心解中可以放。在最优解中没放进去是因为有一个s更大的占据了位置(只考虑s更小的一定能放进去,因为在贪心解中可以放),而这两个可以swap。
直接枚举是 \(O(n^{3}\log n)\) 的。但是发现随着2类摄像头在阶段1的增加,代价不减。那么从小到大枚举2类的个数,每次把不合法的3类挪到阶段1和阶段2中。

1891

CF看题解学了1891E,感觉这种贪心题做不明白。先考虑一次能改变两个相邻关系,那么naive的想法是每次都能改变两个gcd=1的关系。这会在有 \(a_{i}=1\) 的时候挂。对于1和非1相邻,从非1的角度,这对关系与操作它无关,可以把贡献全部算在1上,相当于它旁边没有1,对于一段连续的1,每一对关系被改变当且仅当两个数都被操作。这启发我们把1连续段拎出来看。变成了可以用len的操作消除len+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数组即可。

1916

H2

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,构造解即可。 ## 1919 ### D 考虑如何生成一个合法的序列,发现可以拿出一个数x,变成一对相邻的x和x+1。 那么对于给定的终态,我们倒着消即可。先消最大值a,因为最大值不会对消其他值做贡献。找一个相邻的a-1即可。 发现这个就是求前/后面第一个比自己小的数有没有自己-1,单调栈即可。 ### E 经典插入计数dp,从小往大查。发现要记录的是i-1形成了多少个连续段以及左右两端是不是i-1的连续段。 ### F ## 1923 ### F 因为交换操作可以提前,那么操作序列可以调整成先交换再翻转。显然>2次的翻转是无效的。简单思考可以发现,2次翻转也一定是不优的,这一次不如拿来缩小长度。那么讨论翻转0/1次。0次显然,对于1次的情况,发现最优解就是在保证长度最短的前提下,反串字典序最小的后缀(证明:如果两个串A,B满足 $A\leq B$,那么把靠后的若干0补齐后仍然有$A'\leq B'$)。 ## 1928 ### 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 一个重要的观察:如果相邻的两个数相同,那么一定有两个数相等,所以一个子正方形合法当且仅当把相邻相同看成隔板,那么子正方形中没有隔板,或者等价的说,子矩形完全在隔板隔出的子矩形内。 一次区间加只会插入/删除常数个隔板,一个隔板隔出的子矩形内的贡献是讨论长宽大小关系后是关于长和宽的低次多项式,直接用值域线段树维护两个方向上的隔板大小。隔板有变化时直接查询贡献并删除/加入即可。 ## 1929 ### E 因为选择的每个点都必须有贡献,那么选择的点数不超过k,以及只有虚树上的边才有用,所以可选择的范围也是O(k)的。 ### F 把二叉搜索树按照dfs序拍平之后就是课本例题级的计数。 ## 1930 ### 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的转移有两个偏序,一个是值的偏序,因为最大前缀序列单增;另一个则是我们构造的这种顺序,而我们构造的这种顺序在维护信息上更方便。 ## 1936 ### 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)。 ## 1937 ### 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)$。 ## 1943 ### C 首先考虑一条链,显然操作次数有 $\lceil \frac{len}{2} \rceil$ 的下界,更细致地,如果 $len$ mod 4=2,那么需要在前面的基础上再加1,证明可以黑白染色这条链,一次会染两个同色点,最后会剩两个异色点,无法一次解决。 考虑构造方案,直径长度len为奇数则在直径中心从大到小一次操作即可。len为偶数则在直径中心边的两侧的两点操作2次可以消除4个点。 ### D 一个必要条件是 $a_{i}\leq a_{i-1}+a_{i+1}$,这也是充分的。证明对 $\sum a_{i}$ 归纳。 直接dp记录i和i-1两个值就能过d1。 考虑容斥不合法的位置个数,设 $dp_{i,j,0/1}$ 为考虑数组的前i个元素,第i位是j,容斥系数为-1/1的方案数,转移枚举是否在i-1处创造一个不合法位置。 ![img](https://img2023.cnblogs.com/blog/1709175/202403/1709175-20240320003333308-683741792.png) ### E 二分答案后Alice的决策是显然的,一定是拿走出现次数最少的那个。Bob的决策不是很一眼,那么考虑枚举bob最后能让Alice拿不到哪个x。把所有出现次数按照大小排序,因为Alice每次拿最小,每个元素等价,那么Bob的操作不会破坏排序关系。贪心的想,Bob一定希望x尽可能被多拿,那么策略就有了:在不破坏排序关系的情况下多拿x。暴力模拟即可过D1。智慧的模拟方法是,观察出整个过程先是后缀-1,直至序列变得平均,然后接着平均的拿。二分找出这两种的分界时刻,得到最后会变成形如(n,m)的状态(剩下m个n和n-m个n-1)。对于固定的n,一定是有一个分界点k使得m大的时候拿不完,小的时候可以拿完。递推一下可以做到线性或者直接二分也可以。复杂度两个log。 ## 1948 ### E 很朴素的想法是一定存在一种构造使得大小可以取到 $k$。考虑这样构造:前一半摆 $\frac{n}{2}$ 到 1,后一半摆 $n$ 到 $\frac{n}{2}$。验证一下可以知道任何时刻不等式均满足。 ### G 最大匹配=最小点覆盖。枚举最小点覆盖,求一个最小生成树。这相当于限制不能用那些两端点都不在枚举的覆盖集中的边。 注意最小点覆盖指的是覆盖所有边而不是点。 ## 1949 ### G 考虑一个子问题:教授的数量和教室的数量相同。这时存在方案当且仅当存在一个教室没有课需要上(忽略掉课程类型和教师类型相同的教师)。那么对于教授数量大于教师数量的情况,贪心的删去那些在有课需要上的教室的教授即可,因为这些教室不管删不删教授都不能造出来一个没有课需要上的教室。 ### K 先考虑必要条件,再证明其充分性。 [别人写的简洁优美,我就不再重复了](https://www.luogu.com.cn/article/2pfj217l) 总的来说就是排除最大值所在的集合大于一半和最大的集合大于一半这两种情况即可。 ## 1953 ### F 先证明如果手里有一对排,那么打出去一定不劣。运用调整法,重要的思想是对于任何一张牌,如果早打的收益不比晚打差,那么可以代价不增地从晚打调整到早打,因为现在能打的牌不打只会卡手。 那么只有手中的牌全部不同时(称这种局面是关键局面)需要决策打出那张牌,设 $dp_{i}$表示 $i$ 时刻为关键局面的最小代价。枚举扔掉那两张牌和转移到哪里即可。$O(n^{5})$。注意这里需要费用提前计算,直接dp最小关键局面出现次数在desk的牌抽完之后部分的代价会无法考虑。 然后考虑如何优化,可以发现从指定的 $i$ 转移到指定的 $j$ 只能是某一对牌(因为这要求 $i$ 和 $j$ 之间的牌差只有这一对牌出现了奇数次,其余的必须出现偶数次)。那么对于一对牌,和 $1$ 个 $i$,要么会转移到某个 $j$, $j$只有 $O(n)$ 个,要么会转移到末尾,直接贡献到答案。一旦出现了后一种,那么对于当前 $i$ 就可以停止转移了。这样对于一个 $i$ 的转移就是 $O(n^2)$ 的。 ## 1967 ### B2 题解推的很清楚了。主要是没想到p和q是不超过根号的。 ### C 将树状数组看成一棵树,从叶子向上解。对于一个结点,子树内一个点对它的贡献是一个和深度差有关的组合数。 ### E1 发现一个合法的a可能对应很多个b,反过来亦是。那么考虑让一个a只对应一个b,具体的,让其对应按位最大的b。那么在b上计数,设 $dp_{i,j}$ 表示 $b_{i}=j$ 的前 $i$ 位方案数。复杂度 $O(nm)$。 与此同时还有一种 $O(\frac{n^{2}}{m})$ 的方法:把b的1和-1看成折线,那么非法的折线就是在不碰到某一条直线A的情况下碰到了另一条直线B,枚举碰前的最后一个点,那么就是求不碰两条直线的前提下到达某点的方案数,经典反射容斥即可。 ## 1968 ### C 把经历过合法折叠的纸条看成一个新纸条(而不是执着于被掩盖的部分),所有的都能想明白。 ## 1976 ### E 首先发现在 $l$ 和 $r$ 序列中出现过的数字一定可以确定顺序,然后考虑按照限制从严到松插入未出现的数字 $x$,发现每次插入的方案数是 $(n-x)+d$,$d$ 是大于 $x$ 的段形成的极长段的个数。 ### F 先论证一个叶子个数不超过 $2k$ 的树一定可以被 $k$ 条链完全覆盖。[证明](https://www.luogu.com.cn/article/86z5823v) 然后就是如何选来保证最大,可以证明在没有其他限制的情况下,答案一定是若干条长链(证明基于对于任何一个点的子树,如果子树内有叶子被选了,那么长链的叶子一定被选,否则可以调整)。按照长链长度贪心即可。 还有一个加强版 CF562G,不过不太懂为什么强制一个点就只要微调,不会出现一个变化很大的最优解吗。 ## 1977 ### E 题目的条件就是最长反链不超过 $2$,那么由 dillworth 定理可得最小链覆盖不超过 $2$ ,也就是说本题没有 $-1$。 考虑增量构造。对于黑白两种颜色维护一个栈。尽量去保证栈顶互不连通,这样加入一个点时就能保证至少有一个可选的颜色(否则当前点和两个栈顶形成一个大小为3的反链)。这样的问题是可能会有同时和两个栈顶连通的点加进来,破坏两个栈顶不连通这个性质。把这些点单独塞到另一个栈里,直到当前点和第 $3$ 个栈栈顶不连通,那么让这个点去往一个它能去的栈里,然后第 $3$ 个栈的所有点去往与之不同的栈。 ## 1979 ### E 可以发现在这三个点中一定有两个点在某条对角线上,枚举这两个点,第三个点一定在另一个方向的对角线上。对两个方向的对角线分别做即可。 ### F cf讲的很清楚,这里只总结主要想法。由于感性上来看边数是非常接近完全图的,那么先证明至少有一个点的度数接近 $n$,经过详细论证,是 $n-2$。然后分类讨论最大度是 $n-2$ 和 $n-1$。$n-2$ 时删除这个点后发现对于剩下的部分发现仍然满足归纳的限制,归纳做下去即可。n-1时因为一定有一个点度数不大于 $n-3$,把这两个点一同删掉然后递归。用这个 $n-1$ 作为媒介把 $n-3$ 的点和递归的结果串起来。 还是很有意思的一个题。 ## 1981 ### E 对于有同一个交的若干个区间,只需要按照 $a$ 排序之后连相邻的边即可。那么让一个区间在 $l$ 处加入,$r+1$ 处删除,加入时和相邻的连边。这样连出来的边数是线性的。直接上最小生成树。 ### F 设 $dp_{i,j}$ 表示子树 $i$,延伸上去的链不包括 $j$ 这个值。 可以证明 $j$ 不超过 $O(\frac{n}{\ln n})$。 证明:对于链上的每种颜色 $i$(设其出现次数为 $c_{i}$),答案不超过 $(c_{i}+1)i+4c_{i}$。也就是需要 $O(\frac{t}{i})$ 个颜色 $i$。求和得 $n=O(t\ln t)$。 ## 1982 ### F 场上的想法是找最左和最右的坏点,但是不知道怎么在单点改的操作后重新高效维护。题解的做法是维护所有 $a_{i}<a_{i-1}$ 的位置的集合,设这个集合的最大最小值为 $a$,$b$。那么在 $[a,b]$ 之外的部分一定单调。想想最左边的坏点所代表的元素会在哪里?一定是区间 $[a,b]$ 的min!查询一下区间 min 之后因为前缀单调直接二分即可。这就是要找的 $l$。$r$ 同理。 ## 1984 ### D 先考虑开头不是 $a$ 的所有 $t$。枚举长度 $i$,每个长度可以 $O(\frac{n}{i})$ check。同时统计一下每次 $t$ 出现的位置前面有多少个`a`。 ### E 考虑把过程中每个点被选取的顺序序列a拿出来研究,发现一个点在T2中成为叶子当且仅当它的邻居在a中的位置都在它前面。对于树的每条边定向,表示在a中的出现位置先后关系。任何的定向都是合法的因为一定是有向无环图。一个点对答案贡献1当且仅当它的邻居都指向子集。那么树上dp答案即可。 ### F 考虑没有问号怎么做。 讨论相邻的两个字母的四种情况。发现如果有PS那么整个序列的SUM就知道了。在a,b开头末尾分别添加一个0,在s开头添加一个P,末尾添加一个S。这样就能保证至少有一个PS。PP和SS揭示了一个数,SP结合SUM可以揭示两个数的和,且这个条件不会和其他的一起限制某个值。那么取绝对值最小的解即可。 对于有问号的情况,枚举PS在哪里(O(n)),剩下的直接dp即可。 ## 1984 ### F 如果一个格子是红色意味着行在列之前操作,反之亦然。对于a在b之前这种关系连边,答案就是图上scc大小的平方和。后面涉及到一个冷门的科技,就不补了。 ## 1987 ### F 对于一个给定的删除序列考虑是否合法。把删除看成左右括号,那么括号的包含关系形成一棵树,发现只要每对匹配的括号左边的删除数目大于等于需要的次数即可。那么可以设 $dp_{l,r}$ 表示删除 $l$ 到 $r$ 的最少需要的在 $l$ 左边的操作次数。然后再设 $f_{i}$ 表示前缀的最大次数,这是有最优子结构的(因为删的越多解锁的越多)。$dp$ 的转移是枚举 $l$ 和谁匹配。 $f$ 的转移是枚举最后一段。 ## 1988 ### E ## 2002 ### F 先考虑F1 # 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$ | | | | | | # 洛谷月赛 ## 2024.2(2) ## 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  永无岛  阅读(120)  评论(1编辑  收藏  举报