做题记录
4.17
[ARC101E] Ribbons on Tree
比较简单的题。
考虑合法的答案比较难,于是取补容斥。
然后直接 dp 就行了。
[ARC103F] Distance Sums
分析一下,可以取 dis 和最小的点作为根,那么有根向往外就是有序的递增的。
分析一下发现由父亲到儿子, dis 和的变化是可以算出来的。
于是可以由叶子向上合并。
问题是如果存在 dis 和相同的怎么办,并不知道哪个才是该点的父亲。想到这里就不会了。
然后发现题目保证了 dis 和互不相同,于是就按这思路做就行了。
一定要仔细审题。
[ARC102F] Revenge of BBuBBBlesort!
性质分析题。
分析容易发现能够作为操作中心点的仅为满足 \(p_i==i\) 的 \(i\) 。
设 \(b_i = [p_i==i]\) ,那么可以将原序列划分为若干个块,使得每个块内不存在连续的两个 \(b_i\) 相同的元素。
显然如果原序列存在连续段长度不小于 3 的 \(b_i==0\) 的元素段则无解。
显然每个块之间不存在交换,那么每个块独立考虑。
一个块合法当且仅当:对于所有 \(i\) ,\(p_i\) 在块内;不存在由 \(b_i==0\) 的元素构成的长度不小于 3 的下降序列。
4.19
[AGC061A] Long Shuffle
n 为奇数的情况可以拆成两个 n' 为偶数的操作。
归纳可以证明,当 n 为偶数时,对于每个 \((2i-1,2i)\) 的对,操作后其值要么为 \((A_{2i-1},A_{2i})\) 要么为 \((A_{2i},A_{2i-1})\) 。
对于一个对,其被操作的次数可以由组合数算出。
4.23
CF575A Fibonotci
分段矩乘快速幂,可以线段树维护。
4.26
CF1515E Phoenix and Computers
观察到对于一段极长的手动段,其贡献是一个简单的 2 的幂的形式。
那么对于原序列,划分出若干这样的段 dp 即可。
[AGC061C] First Come First Serve
做的时候完全不知道从哪下手,笑死了。
题目实际上是对 n 个元素定为 \(A_i\) 或 \(B_i\) 中的一个,问本质不同的相对大小的顺次排列。
首先有一个答案的上界 \(2^n\) ,观察是什么造成了重复。
假设考虑元素 i ,默认其选择 \(A_i\) ,如果其他元素没有 \((A_i,B_i)\) 中的值,那么当其转而选择 \(B_i\) 时相对大小不变,就会造成重复。
那么我们就可以钦定一个规则: 一个元素要么选择 \(A_i\) ;要么选择 \(B_i\) 且其他元素存在位于 \((A_i,B_i)\) 中的值。这样原问题就转化为相对可维护的形式了。
显然要取个补。我们只考虑选 \(B_i\) 的元素,强制不存在 \((A_i,B_i)\) 的值容斥。
根据题目性质, \((A_i,B_i)\) 对应到原序列一个区间,是好做的。于是直接容斥就行了。
[AGC061D] Almost Multiplication Table
牛逼题。
首先二分答案,限制变为形如 \(\alpha \leq x_iy_j \leq \beta\)。
假设 \(x_n\leq y_m\) ,那么令 \(x_i\geq \lceil\frac{\alpha}{y_j}\rceil,y_j\leq \lfloor\frac{\beta}{x_i}\rfloor\) ,不断逼近直到无解或有解。
5.2
[AGC060A] No Majority
简单题。
实际手玩一下小数据发现题目限制等价于相同字母之间距离必须大于等于 2 。
[AGC060C] Large Heap
[AGC060B] Unique XOR Path
构造题。
首先要搞清楚题意,同一个数字可以使用多次。
考虑找到一个最小的值域上界使得存在构造,那么询问有解当且仅当其 \(K\) 大于等于该上界。
于是原问题就变成了一个最优性问题,可以贪心地构造。
考虑给出的一条路径,对其扰动调整,显然会在拐角处变化,那么就要求任意其他路径所经过的拐角集合异或和不为 0 ,即不存在拐角子集使得异或和为 0 。那么对于可能出现在同一路径的拐角,,令其取二进制不同位的 1 即可。
注意特判连续拐的情况。
5.10
[AGC059A] My Last ABC Problem
有意思的题。
做的时候想到先确定最后变化到什么字符,那么答案是若干这样相邻的字符内的答案加起来。不过是假的。
正解考虑将原序列复制 1 倍得到一个循环序列。
设相邻字符不同的这样的对数量为 \(k\) ,每次操作最多使 \(k\) 减少 2 ,于是显然有一个答案下界 \(\lceil\frac{k}{2}\rceil\) 。然后手玩可以发现或者证明这个值可以达到。
当 \(k \geq 4\) 时,显然能够做到每次操作减少 2 。
当 \(k=2,3\) 时,分别对应形如 AB 和 ABC 的情况,分别需要 1 次和 2 次,同样满足答案下界。
\(k=1\) 的情况不可能出现。
于是答案下界一定能达到。
发现很多这样的题目都是,先确定一个答案下界,然后考虑证明这个下界能够达到。
5.14
ABC143E Travel by Car
从某个起点开始,到一个点的 "距离" 可以看作是二元组 "代价" 和 "当前油量" 。
由于任意油量只要花费 1 的代价都可以回满,那么贪心的考虑,尽可能使代价少,在此基础上使油量尽可能大。
契合 dj 的最短路算法,使用 \(n^2\) 的暴力版本即可通过。
5.15
AGC002E Candy Piles
博弈
将抽象的博弈问题转化为图形化模型。
先从大到小排个序。
将 \(a_i\) 视为高为 \(a_i\) 个单位的矩形,画出图后,发现一次操作要么从左边缩一列,要么从下面缩一行。
那么可以进一步看作一条由 \((0,0)\) 出发,每次要么往右走要么往上走的路径。
途径点有必败点和必胜点两种状态,观察容易发现规律。
[APIO2022] 排列
构造
\(K\) 很大,显然可以倍增构造。
于是有非常显然的 \(2\log\) 的做法:先倍增出 \(log\) 位的 2 的幂,然后看哪一位为 1 插入对应的幂。
但是题目限制为 \(\frac{3}{2}\log\) ,不能通过。
观察发现如果要插入的 1 存在相邻的,且之前已经插入了不少于 2 个 1 ,那么可以插入一个可以由前面最小、次小值转移的 1 ,这样借助之前的 1 可以多出 1 倍,用 1 个 1 达到原本 2 个 1 贡献。
于是是 \(1\log+\frac{1}{2}\log=\frac{3}{2}\log\) 。
5.25
Counting Orders
煞笔题。
排个序,那么每个数有几种方案是已知的。
Range Sorting (Hard Version)
计数 性质
容易发现如果存在一个数对 \((i,j)\) 满足 \(i<j \and a_i>a_j\) 那么这个数对必须在某一个 sort 操作的区间里面。且 sort 区间不交。
那么有简单的 \(n^2\) dp 。
然后显然要对单个贡献计数,但我不会。
正解考虑对于一个区间 \([i,j]\) ,其必然要拆成若干个子区间 \(l\leq i_1 < i_2 < i_3<..<i_k <r\) 满足\(\max(a[l..i_x])<\min(a[i_x+1..r])\)。
这样的贡献大概可以写为 \(r-l-k\) 。于是考虑对每个这样的分界点单独计算贡献。
考虑钦定 \(\min(a[i_k+1..r])=a_j\) ,容易求出 \(l,k,r\) 的范围,可以不重不漏的统计。
Palindrome Partition
字符串 回文 马拉车 计数 性质
性质题。
容易发现在题目条件限制下:任意个好的字符串必然可以唯一贪心划分为几个极小的好串;且对于一个回文字符串,若其一个前缀是好串,那么除这个好串外剩下的也一定是好串。
预处理出 \(next_i\) 使得 \(ch[i..next_i]\) 是一个极小的好串。
那么设 \(dp_i\) 为以 \(i\) 开头好串数量,则 \(dp_i=dp_{next_i+1}+1\) 。
最后输出 \(\sum\limits_i dp_i\) 即可。
5.30
Two Centroids
性质 结论 树的重心
分析树的重心的性质。
对于一棵树,设当前树的重心为 \(r\) ,以其为根最大的子树大小为 \(mx\) ,则令其有两个重心最少要添加的点为 \(n-2\cdot mx\) 。
当不断添加点使得其重心变化时,必然为其作为根时存在子树大小大于等于总点数的一半,此时更新重心后新的 \(mx=\lfloor\frac{n}{2}\rfloor\) 。
Bus Routes
性质 二分
简单分析发现只用考虑叶子出发的路径。
每个叶子对应的路径对应一个虚树,问题等级为是否所有虚树都有唯一共同的交点。
二分第一个不可能与其他有唯一共同交点的虚树,求交过程可以在原树上差分覆盖。
6.1
[APIO2023] 序列 / sequence
性质 二维数点 中位数
考虑枚举中位数 \(x\) ,分析 \(x\) 在区间 \([l,r]\) 中为中位数的条件。
设区间中比 \(x\) 小的数数量为 \(c0\) ,比 \(x\) 大的数数量为 \(c1\) , \(x\) 的数量为 \(c\) ,则 \(x\) 为中位数应满足 \(c+c0\geq c1 \and c+c1\geq c0\) ,即 \(\max(c1-c0-c,c0-c1-c)\leq 0\) 。
换成前缀差分形式,设 \(u_i=c([1,i],1)-c([1,i],0)-c([1,i],x),v_i=c([1,i],0)-c([1,i],1)-c([1,i],x)\) ,则应满足 \(\max(u_r-u_{l-1},v_r-v_{l-1})\leq 0\) 。
将 \(p_i=(u_i,v_i)\) 看做点,则 \(p_r\) 应在 \(p_{l-1}\) 的左下方。
进一步分析序列往后添加一个数在点图上的贡献: 做 \(a_i=x\) 则 \(p_i\) 是 \(p_{i-1}\) 往左下走一步;\(a_i\lt x\) 则是往左上走一步;\(a_i\gt x\) 则是往右下走一步。
对于 \(x\) 出现的位置划分的若干段,分别对应图上若干条线段,线段之间由 \(x\) 造成的短边隔开,要求的即为一对互为左下右上的线段之间短边的数量的最大值,即对应段序号的差的最大值。
互为左下右上的条件可以化为二维偏序的形式,可以用线段树求出坐标,然后用树状数组二维偏序。
参考博客
6.2
Hyperregular Bracket Strings
性质 技巧
分析容易发现位置实际分成了不同的组,单个组的答案是独立的,是卡特兰数。
有几个简单的情况:1.区间相交 2.区间完全包含
但是当多个区间呈上述两个关系时,分组就显得复杂了。
于是有一个更强的结论,为每个区间赋一个随机的权值,令每个位置的权值为所有包含它的区间的异或和,则两个位置在同一组当且仅当权值相等。
6.3
Mex Tree
贪心 dp 优化
首先有贪心的想法,虽然并不对,但是能够提供的一个答案下界。
反过来考虑,钦定一个同色联通快的大小 dp ,最小化损失的答案,背包即可。
那么状态有点和联通快大小两维, \(n^2\) 级别,显然无法通过。
不过根据贪心的界,发现联通快的大小最大不超过 \(O(\sqrt n)\) 级别。
于是复杂度 \(O(n\sqrt n)\) 。
6.4
Bully Sort
性质 转化 cdq
如果真的想去模拟或者优化模拟题述操作,会非常复杂。
考虑寻找一些不变量,探讨之间的关系。
分析一下会发现题述操作有一些优良的性质。
由于序列是个排列,当通过操作 swap 位置\(i\) 和 位置\(j(i\lt j)\) 时,可以发现 \(i\),\(j\) 之间的数的值必然在两者之间。
进一步的,对于一次交换,设 \(k=j-i\) ,则它使得 \(\sum |i-p_i|\) 减少 \(2k\) ,逆序对数减少 \(2k-1\) 。又因为最后两者同为 \(0\) ,于是操作次数 \(= \sum|i-p_i|-\sum_{i\lt j}[p_i\gt p_j]\) 。
这样维护答案就容易了。
6.8
【UR #25】见贤思齐
倍增
建图是显然的。经分析基环树显然可以化为树的情况,这里只考虑树的做法。
设点 \(x\) 在时刻 \(t\) 的答案为 \(f(x,t)\),容易得到一个递推关系 \(f(x,t)=\max(\min(f(p_x,t-1)+1,a_x+t),a_x) (t\gt 0)\) 。
考虑换个元化为更简洁易维护的形式,设 \(g(x,t)=f(x,t)-t\) ,则 \(g(x,t)=\max(\min(g(p_x,t-1),a_x),a_x-t)\) 。
直接维护 \(g\) 有点难,考虑位置 \(\max\) 和 \(\min\) 的界。
令 \(l=-\infin , r=\infin\) ,每次 \(l=\max(l,a_x-t),r=\min(r,a_x)\) ,并令 \(x\) 跳到 \(p_x\) 。当 \(l\geq r\) 时答案就确定了。
可以倍增优化。
6.10
Surprise me!
数论 结论 套路
\(\varphi(a_ia_j)=\frac{\varphi(a_i)\varphi(a_j)\gcd(a_i,a_j)}{\varphi(\gcd(a_i,a_j))}\)
枚举 \(\gcd\) ,构造函数 \(F(x)=\sum\limits_{x|d}f(d)\),使用莫反。

浙公网安备 33010602011771号