Codeforces Round #700 (Div.1)

上红成功。

A.Searching Local Minimum

题意:交互题,事先确定一个长度为n的排列,可以询问不超过100次某位置的值,最终给出一个位置,满足两边相邻的元素值(如果存在)都大于这一位置的元素。 n105

题解:小范围暴力。否则考虑询问1,2,n1,n的位置,判断1n位置是否满足条件。

如果都不满足条件,可以证明可以从中选出三个数x,y,z满足x<y<zax>ay,az>ay。考虑不断缩小三元组的值的距离。迭代,取yxzy中较大者,假设为yx,那么询问t=x+y2处的值,比较其和ay的大小,at<ay(x,y,z)(x,t,y),否则(x,y,z)(t,y,z),可以证明这样迭代会以O(logn)的复杂度得到符合条件的一个位置。

B1/B2.Painting the Array

题意:将长度为n的数组划分为两个数组,满足归并后为原数组,且两数组不同颜色连续段个数之和最大/最小。 1n105

题解:其实有一个统一的做法:暴力dp,设考虑前i个位置,两段末尾的颜色分别为ab的答案的最大/最小值为fi,a,b。由于第i个元素一定在某一个数组的末尾,因此其实颜色a是确定的,可以用一棵线段树维护以b为下标的fi数组,转移到i+1,分为加入a之后和加入b之后讨论:如果加入a之后,b下标不变,若ii+1颜色不同,数组全体增加1;如果加入b之后,一定更新下标为i的颜色的位置,讨论之前的b的颜色和i+1是否相同,分区间查询线段树的最值即可更新答案。总复杂度O(nlogn)

C.Continuous City

题意:构造一张不超过32个点的正边权简单DAG,满足1n长度为x的路径恰好有一条,x=L,L+1,,R

L,R106

题解:考虑递归,L=R直接连边,否则令mid=L+R+121,先构造关于[L,mid]的图,设终点为t,新建一个复制点t,将t的入边复制一遍,再由tt连一条长度为mid+1L的边,此时,点t已经对区间[L,R((RL+1)mod2)]满足题目条件,若RL+1是奇数,则额外新建一个工具点t,构造一条1tt的长度为R的路径即可。可以证明点数是O(logR)的。

D.Odd Mineral Resource

考场上最后一分钟交题被卡常了...不爽

题意:一棵大小为n的带点权的树,q次询问,每次问uv的路径上,是否存在[l,r]中的权值,在路径上出现奇数次,如果有输出任意一个。

n,q3105

题解: 考虑判断一个询问是否存在[l,r]之间的答案:对[l,r]中的每个数随机分配一个权值,计算uv的路径点权值异或和是否为0即可。 因此类似于整体二分,先将q个询问用线段树规则拆分成O(logn)个询问插入二分过程中。现在询问的答案在[l,r]之间,队列中有权值为[l,r]的点和待回答的答案在这个区间内的询问。由于有中途插入的询问,先判断一遍是否在[l,r]有解。接下来取mid=l+r2,判断每个有解询问是否在[l,mid]中仍然有解,如有分在左半部分,否则在右半部分,点则按照权值分在两部分,递归进行即可。

分析复杂度,假设某一过程有k个操作,利用树状数组+lca统计路径异或和,复杂度为O(klogn),每个点操作会被执行O(logn)次,每个询问会先被拆分为O(logn)个,拆分后每个询问又最多递归O(logn)次。但这里有一个优化:初步拆分的O(logn)个询问,可以先判断一遍是否有解,选取一个有解的继续递归O(logn)次寻找答案即可。于是总复杂度是O(nlog2n)

E.School Clubs

题意:有n个人,每个人恰好属于m个俱乐部中的一个,每轮随机选一个人,12的概率令其单独成立一个新俱乐部(只有一个人),12的概率从已有俱乐部中随机选一个加入,对于此人离开前人数为a的俱乐部,其被选择的概率为an。求所有人都在一个俱乐部内的期望时间。

题解:这是一个期望停时问题,可以通过建立一个势函数来解决。解决方法见出题人的blog (opens new window)。 假设现在的俱乐部人数可以用一个可重集A表示,根据信仰,我们认为存在一个合法的势函数可以写成如下形式:

ϕ(A)=aAf(a)

那么由停时定理,问题转化为求if(ai)f(n),其中ai表示初始时刻第i个俱乐部的人数。现在关注如何求解f

首先,由于添加若干个人数为0的俱乐部没有影响,一定有f(0)=0

那么为了满足E[ϕ(At+1)ϕ(At)At,At1,,A1,A0]=E[ϕ(At+1)ϕ(At)At]=1,根据题目的转移规律有:

E[ϕ(At+1)ϕ(At)At]=aAan(12(ϕ(Ak)f(a)+f(a1)+f(1))+a2nϕ(Ak)+12bA,babn(ϕ(Ak)f(a)+f(a1)f(b)+f(b+1)))ϕ(At)=12(f(1)+aAan((2an)(f(a1)f(a))+(1an)(f(a+1)f(a))))=1

A的任意性,可得12f(1)=1,于是f(1)=2 ,于是:

(2an)(f(a1)f(a))+(1an)(f(a+1)f(a))=0

g(a)=Δf(a)=f(a+1)f(a),转化得:

g(a)g(a1)=2nanag(a)=g(0)i=1ag(i)g(i1)=2i=1a2nini

可以验证:

f(a)=f(0)+i=0a1g(i)=2i=0a1j=1i2njnj=2nn1(i=1a2nin+1i1)

于是:

(1)f(a)=2nn1(i=1a2nin+1i1)(2)=2nn1((2n1)!(na)!(2na1)!n!1)

接下来的处理和鬼牌 (opens new window)类似,设阈值T,对于a1,a2,,am,分为T>T两部分。T的部分,由(1)式通过O(T+mlogMOD)的复杂度递推求解;>T的部分不超过nT个,利用(2)式配合分段打表求阶乘解决,假设打表间隔为T,这一部分的复杂度就是O(nTT)

综上所述,解决问题的时间复杂度为O(T+nTT+mlogMOD),考虑到打表,空间复杂度为O(m+nT)。可以取T=107,T=2105(CF的代码长度限制为65535B)。