zoukankan      html  css  js  c++  java
  • Codeforces Round #700 (Div.1)

    上红成功。

    A.Searching Local Minimum

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

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

    如果都不满足条件,可以证明可以从中选出三个数(x,y,z)满足(x<y<z)(a_x>a_y,a_z>a_y)。考虑不断缩小三元组的值的距离。迭代,取(y-x)(z-y)中较大者,假设为(y-x),那么询问(t=lfloorfrac{x+y}{2} floor)处的值,比较其和(a_y)的大小,(a_t<a_y)((x,y,z) o (x,t,y)),否则((x,y,z) o (t,y,z)),可以证明这样迭代会以(O(log n))的复杂度得到符合条件的一个位置。

    B1/B2.Painting the Array

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

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

    C.Continuous City

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

    (L,Rleq 10^6)

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

    D.Odd Mineral Resource

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

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

    (n,qleq 3*10^5)

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

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

    E.School Clubs

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

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

    [phi(A)=sum_{ain A}f(a) ]

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

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

    那么为了满足(mathbb{E}[ phi(A_{t+1})-phi(A_t) mid A_t, A_{t-1}, dots, A_1, A_0 ]=mathbb{E}[ phi(A_{t+1})-phi(A_t) mid A_t]=-1),根据题目的转移规律有:

    [mathbb{E}[ phi(A_{t+1})-phi(A_t) mid A_t] ]

    [=sum_{ain A}frac{a}{n}Bigg(frac{1}{2}Big(phi(A_k)-f(a)+f(a-1)+f(1)Big)+frac{a}{2n}phi(A_k)+frac{1}{2}sum_{bin A,b otequiv a}frac{b}{n}Big(phi(A_k)-f(a)+f(a-1)-f(b)+f(b+1)Big)Bigg)-phi(A_t) ]

    [=frac{1}{2}Bigg(f(1)+sum_{ain A}frac{a}{n}igg(Big(2-frac{a}{n}Big)Big(f(a-1)-f(a)Big)+Big(1-frac{a}{n}Big)Big(f(a+1)-f(a)Big)igg)Bigg) ]

    [=-1 ]

    (A)的任意性,可得(frac{1}{2}f(1)=-1),于是(f(1)=-2)
    ,于是:

    [Big(2-frac{a}{n}Big)Big(f(a-1)-f(a)Big)+Big(1-frac{a}{n}Big)Big(f(a+1)-f(a)Big)=0 ]

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

    [frac{g(a)}{g(a-1)}=frac{2n-a}{n-a} ]

    [g(a)=g(0)prod_{i=1}^afrac{g(i)}{g(i-1)}=-2prod_{i=1}^afrac{2n-i}{n-i} ]

    可以验证:

    [f(a)=f(0)+sum_{i=0}^{a-1}g(i)=-2sum_{i=0}^{a-1}prod_{j=1}^ifrac{2n-j}{n-j}=-2frac{n}{n-1}Big(prod_{i=1}^afrac{2n-i}{n+1-i}-1Big) ]

    于是:

    [f(a)=-2frac{n}{n-1}Big(prod_{i=1}^afrac{2n-i}{n+1-i}-1Big) ag{1} ]

    [=-2frac{n}{n-1}Big(frac{(2n-1)!(n-a)!}{(2n-a-1)!n!}-1Big) ag{2} ]

    接下来的处理和鬼牌类似,设阈值(T),对于(a_1,a_2,dots,a_m),分为(leq T)(>T)两部分。(leq T)的部分,由((1))式通过(O(T+mlog m{MOD}))的复杂度递推求解;(>T)的部分不超过(frac{n}{T})个,利用((2))式配合分段打表求阶乘解决,假设打表间隔为(T'),这一部分的复杂度就是(O(frac{n}{T}T'))

    综上所述,解决问题的时间复杂度为(O(T+frac{n}{T}T'+mlog m{MOD})),考虑到打表,空间复杂度为(O(m+frac{n}{T'}))。可以取(T=10^7,T'=2*10^5)(CF的代码长度限制为65535B)。

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/Mr-Spade/p/14391514.html
Copyright © 2011-2022 走看看