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\) 的最短时间。
因为没有负边可以用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\) 的约数即可,对于一组询问,答案为
初始给每个位置赋初值为约数个数,对询问按照左端点排序,枚举左端点,每枚举一个就把当前枚举值的倍数的约数个数-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}\)。求直径。
在加上这些边之后,两点的最短距离只有两种可能,即原树上的简单路径或者在两点的子树中找深度最小的叶子,先到达叶子,然后走新加的边到另一个叶子,再到终点。
考虑点分,先处理过重心的所有路径。
直径可以写成这个样子:
如果类似于树链剖分一样,选择拥有最浅的叶子的儿子为重儿子,树将被剖成若干条链,其中对于同一条链上所有节点,“子树内深度最小的叶子”相同。那么,对于两个点,如果他们所属的链已经确定, \(\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(链顶)-\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
对这个限制讨论:
考虑前 \(k\) 位 相同,第 \(k+1\) 位不同。
对于前 \(k\) 位:
第 \(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下面的部分这里讲得很好,就直接截图了。
还有另外一种拆贡献的做法,感觉是异曲同工。拆贡献的做法要枚举两边的方案数,这个只需要枚举一边,另一边放在转移路径中计算了。
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
把题目的目标形式化的表达出来:
要求互不相交,每个区间的权值只与端点有关,可以设计 \(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条边被置为重边,那么环上就已经全部变为自环了。这样就会算重。那么把这些状态减掉,答案就是:
其中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_{\frac{i}{2^{k}}}\),就能保证信息封闭。并且转移矩阵只与 \(i\) 的后缀0个数有关。
1868
E
大概学了个思路,感觉不会写转移。
给序列 \(a_{i}\)。
你要找一个大小为k的划分,令 \(s_{i}\) 为划分后每一段的和,对于任意 \(1\leq i\leq j\leq n\) 满足:
现在询问你一个最大 \(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的基础上,如果每次只暴力转移
的区间 (显然由题目限制,只转移这些仍然可以得到最优解,换句话说,一定存在一个最优解满足选择的每个区间都满足如上性质)。那么每个右端点的暴力转移次数就是新插入的隔板数+常数。每次至多拿走一个隔板,根据势能分析可得暴力转移次数是线性的。
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序列的和。形式化一下:
先考虑一个不含-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
。只要论证
\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}
ans=min(ansl,ansr,跨过中点的区间的贡献)