namespace_std
2021-02-24 22:03:01
直接维护有多少个
分类讨论:
如果所有
如果存在
否则,答案为
考虑维护一个
可以发现,对于一个位置
如果它被经过的次数超过了
最后将每个位置的
C
位置的题目,我们删掉了数据结构的部分,允许了 显然加一个非
我们可以将一串
可以发现,你一定是先将
于是先判断
我们可以找到至多
可以证明,只要任意选择任意一条边暴力分裂并判定得到的两棵子树,判定的结果就是准确的。
证明:
考虑归纳法。假设对于任意大小不大于
对于一棵大小为
这样,无论你这一步如何切割,下一步由于较大的部分大小不超过
所以,切两条边中的任意一条都等价于将树分裂成上述三部分,因此两种分割方式等价,从而对于
考虑每次询问一侧放第
这样,你问到的第一个非
你可以借此找到所有有磁性的磁铁:第
询问次数
赛前评论区说 交互 = 二分 的能不能刀了
这道题分为两部分:
我们先交换两个环上的任意一对元素。
然后,我们发现可以通过不断将第一个环上元素和被置换位置交换来将第一个置换环除被交换数位置之外的所有位置归位;同理第二个环也可以这样归位。
之后,将两个被交换位置换回去。
如下:
如果这个置换环长度大于
如果这个置换环长度等于
至此,我们即可在
考虑将下标分块,并维护
显然
然后用类似重链剖分的思路跳 LCA
即可做到
Orz Oolimry
不会(
以下搬运自官方题解;感谢 @serverkiller 的贡献。
题面中有一句彩蛋:
Zookeeper is just a duck.
指的是 oolimry 原来的 id 是 Zookeeper ,但是现在他是只鸭子了(
如果您想在赛时做这题的话,记住 errorgorn 说的话:
It's a waste of time.
首先我们可以把题意中的队列转换成一个环,王位按环上的顺序进行继承。
假设我们认为王位是顺时针旋转的,那么王位所在的人会和顺时针的下一位进行决斗。
我们将环上顺时针的下一位称作顺次位;同理我们将环上逆时针的下一位称作逆次位。
有两种情况:
无论是哪种情况,王位都会向顺次位移动。
这里放一张图方便理解(其中
在这样的题意下,我们把王位融入了战斗顺序中,方便我们进行后续处理以及性质的发现。
如果一个动物
换句话就是,当一个动物是红色时,可以帮助他的逆次位从第一任期到第二任期过渡。
我们先假设没有两个红色相邻。
接下来我要证明的是:在 part 1 所转化的题意中,一个非红色不会成为红色。
我们假设
X,Y,Z 位置连续,X,Z 是非红色,Y 是红色。我们让X 进入第一任期,由于我们竞选不能结束因为结束了讨论这个没有意义,所以我们令C_X<A_Z 。注意到保证了
A_i>B_i,C_i>B_i :考虑
B_X>A_Y\to A_X>B_Y ,在打败了Y 之后X 并不能成为红色。考虑
C_X<A_Z\to B_X<A_Z ,所以Z 也不能成为红色。
所以,一个非红色的动物无法成为红色,但显然
所以在选举的过程中,整体的红色数量是单调不增的,这是这题一个重要的性质。
这部分是这题比较难的地方。
我们注意到,由于红色动物不会增加,其消失次数至多为
所以我们可以考虑快速计算两次红色消失之间的轮数。
我们定义一个事件,为以下两种之一:
让我们再关注一些性质:
非红色位置之间的相对顺序不会变化。
我们把红色点抽出来,将其他点看做不动,而红色点向逆次位移动,如下图:
每经过
我们将非红色的动物,再划分成绿色和蓝色,分别标注能结束竞选与不能结束竞选。
蓝色的定义是: 赢了前一个红色,但输给了后一个动物;
绿色的定义是: 赢了前一个红色,也赢了后一个动物。
考虑现在两种事件的条件:
我们可以对于每个红色的动物,在非红色动物按顺序排列构成的环上进行二分,找到上述两个事件中较早发生的进行转移。
当我们确定会经过多少个完整的
如果没有动物的颜色发生变化,或者永远不会发生任何事件,输出 -1 -1
。
我们回头来看一下有两个红色相邻的情况。
如果有两个红色相邻,可以发现竞选会在不超过
我们也可以不进行特判,而是直接暴力模拟前
复杂度分析:一共会发生至多
总复杂度:
(译者注:事实上由于两个红色位置不会相邻,事件数量和对每个红色位置二分这两部分的常数都至多为