感觉完全没有 *2700?
看到题,猜测 不会很大,于是按照路径种类分类讨论一下路径 。下设 为最小质因数,并且更下面的情况不包括上面的情况。
梦境原来就是回忆的足迹
套路题。想要做类似的还可以做做 P6116。
对于不断交换两个数的操作,容易发现确定开始位置 s 和最终位置 t,操作次数固定为 ∣s−t∣。所以可以考虑对答案序列进行 dp。
容易想到设 dpi,j 为当前已经放好了前 i 个白色和 j 个黑色,最少需要多少次操作。则有状态转移方程:
其实赛时可能可以做出来的,只是打了前 6 道想下班了,有点小小遗憾。
首先问题看起来很唬人,考虑转换一下。考虑已经固定 m 条边,对于一个集合 S,什么时候会不与其他点有边。容易发现,此时需要满足 ∑[Ri∈S]=∑[Bj∈S]。记这个数为 cS。但是这还不够,因为 S 中点连边方案数还没有计算。
这个答案显然不是 cS!。因为 S 可能可以分成两个集合 s,t 都满足上述条件,则会重复计算。考虑如何去重。设 dps 为集合 S 的答案。我们钦定 t 包含 S 里最小的元素,则有 dps=cs!−∑t∈Sdpt×(cs−ct)!。
居然自己想出了 AGC E。
首先考虑删边再加红边的本质是什么。容易发现,如果一条目标树上的边当前还没有被加上,且这条边所连两点在原树上的路径被切断,则此时一定无解。因为不管怎么加删边,这都是一棵树,而此时两点路径上一定有红边。
所以,我们就可以得到此时可以新增一条边 (u,v) 的条件:路径上存在一条边,没有一条没有新增过的目标树上的边 (u′,v′),使得原树上 (u′,v′) 的路径不经过改变。容易发现,这等同于在原树上把所有 (u,v) 路径上边的边权 +1,查询路径上有没有边权为 1 的边。简单树剖维护即可。
唯一的一篇题解用了点分治。太暴力了!这很蠢(指做法)。我们有一个优美的做法。
首先 n 为奇数时,答案一定为 1。
证明:设答案点集为 T,则 T 显然一定为一个连通块。考虑从 T 中一个点 x 移动到 y 时,S 中有些点对答案距离贡献增加,有些减少。只有这两者相等时答案不变。但是 n 为奇数,不可能取等,所以 ∣T∣=1。
先假设对于所有 (i,j) 之间都连一条长度为 X 的边,则问题转换成:只保留树边,记 D(i,j) 表示 min(dis(i,j),X),求 ∑D(i,j)。
考虑套路点分治,算出 ∑i∑j>i[dis(i,j)<X]=A,∑i∑j>i[dis(i,j)<X]×dis(i,j)=B,则 ans=B+((2n)−A)×X。算的方式就是将当前处理的以 rt 为根的子树中所有点 i 的 dis(i,rt) 排序后双指针。
这一部分是一个板子,不做赘述。只需要注意点分治常见错误,如求重心某些地方写成 n 而不是 siz 即可(我怎么又踩坑啊)。
非常巧妙的题!
先尝试分析一些简单的性质。
首先,每个棋子可以视作只往一个方向移动若干距离,因为这个操作相当于原本边权为 0,每走一步将边权 ⊕1。显然走回头路会抵消掉之前走的。也就是说,可以将问题转化成,对于每个 ai 选择一个 bi,将 [ai,bi] 间的边权 ⊕1,使得最后的边权序列满足要求。
场上 20min 过了。感觉现有题解对复杂度分析有点问题,于是写一写。
首先置换的形状显然是若干个环。考虑设操作次数为 k,依次对每个环贪心。对于一个长为 l 的环 i,在满足限制的情况下,贪心地把 a 中更小的放到前面。设在这种情况下要求 kmodl=fi。
考虑这个环的操作对于其他环的操作有什么限制。若后面有另一个长为 l′ 的环 j。若 gcd(l,l′)=1 则显然没有限制。否则,若存在 d∣l,d∣l′,则会有限制:fimodd=fjmodd。
为啥这种题大半的题解会都是一样的?来个不同做法的。
首先可以发现,对于一个固定位置操作若干次大概是能使这个位置变成任意一个数的。于是有个猜测的做法:倒序枚举 i 不断对 0 操作直到 P0=i,然后再操作一次使 Pi=i。
试了一下发现不太行。因为如果此时 a0=0 就怎么也动不了了。然后发现 0 其实非常不好,但是发现,可以通过操作若干次数字 n−1 的方式使 P 循环位移,于是先不断操作 n−1 使 0 固定到 Pn−1 的位置。
这种小清新题真是太有趣啦!
如果你做过 AGC027E,看到这种两个字符合成一个,最后还要计数的问题,可以构造一个关于 S 的简单函数 f(S),使得不管怎么操作 f(S) 都不变,然后从这个不变中寻找性质。
对于 AGC027E,这个构造的方法就是令 a→1,b→2,f(S)=∑Simod3。于是这题我一开始也想的是模意义下的东西,但是一直没想出来。直到想到异或,瞬间有如醍醐灌顶:令 a→1,b→2,c→3,设 f(S)=⨁Si,这样就成功构造出来了一个不变的 f(S) 了。