Codeforces Round #700 (Div.1)
上红成功。
A.Searching Local Minimum
题意:交互题,事先确定一个长度为的排列,可以询问不超过次某位置的值,最终给出一个位置,满足两边相邻的元素值(如果存在)都大于这一位置的元素。
题解:小范围暴力。否则考虑询问的位置,判断和位置是否满足条件。
如果都不满足条件,可以证明可以从中选出三个数满足且。考虑不断缩小三元组的值的距离。迭代,取和中较大者,假设为,那么询问处的值,比较其和的大小,则,否则,可以证明这样迭代会以的复杂度得到符合条件的一个位置。
B1/B2.Painting the Array
题意:将长度为的数组划分为两个数组,满足归并后为原数组,且两数组不同颜色连续段个数之和最大/最小。
题解:其实有一个统一的做法:暴力dp,设考虑前个位置,两段末尾的颜色分别为和的答案的最大/最小值为。由于第个元素一定在某一个数组的末尾,因此其实颜色是确定的,可以用一棵线段树维护以为下标的数组,转移到,分为加入之后和加入之后讨论:如果加入之后,下标不变,若与颜色不同,数组全体增加;如果加入之后,一定更新下标为的颜色的位置,讨论之前的的颜色和是否相同,分区间查询线段树的最值即可更新答案。总复杂度。
C.Continuous City
题意:构造一张不超过个点的正边权简单DAG,满足到长度为的路径恰好有一条,。
题解:考虑递归,直接连边,否则令,先构造关于的图,设终点为,新建一个复制点,将的入边复制一遍,再由向连一条长度为的边,此时,点已经对区间满足题目条件,若是奇数,则额外新建一个工具点,构造一条的长度为的路径即可。可以证明点数是的。
D.Odd Mineral Resource
考场上最后一分钟交题被卡常了...不爽
题意:一棵大小为的带点权的树,次询问,每次问到的路径上,是否存在中的权值,在路径上出现奇数次,如果有输出任意一个。
题解:
考虑判断一个询问是否存在之间的答案:对中的每个数随机分配一个权值,计算到的路径点权值异或和是否为即可。
因此类似于整体二分,先将个询问用线段树规则拆分成个询问插入二分过程中。现在询问的答案在之间,队列中有权值为的点和待回答的答案在这个区间内的询问。由于有中途插入的询问,先判断一遍是否在有解。接下来取,判断每个有解询问是否在中仍然有解,如有分在左半部分,否则在右半部分,点则按照权值分在两部分,递归进行即可。
分析复杂度,假设某一过程有个操作,利用树状数组+lca统计路径异或和,复杂度为,每个点操作会被执行次,每个询问会先被拆分为个,拆分后每个询问又最多递归次。但这里有一个优化:初步拆分的个询问,可以先判断一遍是否有解,选取一个有解的继续递归次寻找答案即可。于是总复杂度是。
E.School Clubs
题意:有个人,每个人恰好属于个俱乐部中的一个,每轮随机选一个人,的概率令其单独成立一个新俱乐部(只有一个人),的概率从已有俱乐部中随机选一个加入,对于此人离开前人数为的俱乐部,其被选择的概率为。求所有人都在一个俱乐部内的期望时间。
题解:这是一个期望停时问题,可以通过建立一个势函数来解决。解决方法见出题人的blog (opens new window)。
假设现在的俱乐部人数可以用一个可重集表示,根据信仰,我们认为存在一个合法的势函数可以写成如下形式:
那么由停时定理,问题转化为求,其中表示初始时刻第个俱乐部的人数。现在关注如何求解。
首先,由于添加若干个人数为的俱乐部没有影响,一定有。
那么为了满足,根据题目的转移规律有:
由的任意性,可得,于是
,于是:
令,转化得:
可以验证:
于是:
接下来的处理和鬼牌 (opens new window)类似,设阈值,对于,分为和两部分。的部分,由式通过的复杂度递推求解;的部分不超过个,利用式配合分段打表求阶乘解决,假设打表间隔为,这一部分的复杂度就是。
综上所述,解决问题的时间复杂度为,考虑到打表,空间复杂度为。可以取(CF的代码长度限制为65535B)。