IOI2020北大集训 - day4

天涯浪子 提交于 2019-12-26 00:43:14

A - xor

题意

给定n,dn,d,求

0x,y,z<n(xyz)d(mod998244353) \sum_{0\le x,y,z < n }(x \oplus y\oplus z)^d \pmod {998244353}

其中\oplus表示按位异或。

n<230,d100000n< 2^{30},d\le 100000

Sol

部分分:d10d\le 10

下面是一个和正解毫无关系的暴力。

通过数位dpdp单独对二进制每一位进行考虑。考虑怎么算答案,设pip_i表示第ii位是00还是11,由多项式乘法的组合意义可得:

(i=0lognpi2i)d=d!l1+l2++llogn=di(pi2i)lili! (\sum_{i=0}^{\log n} p_i 2^i)^d \\ =d!\sum_{l_1+l_2 + \cdots +l_{\log n}=d} \prod_i {(p_i2^i)^{l_i}\over l_i!}

dpdp状态中加入一维表示l1+l2+lcur_lenl_1 + l_2 +\cdots l_{cur\_len},就可以在O(logn23d2)O(\log n \cdot 2^3 \cdot d^2)的时间内解决问题。

正解

枚举x,y,zx,y,z最高的和nn不同的一位,假设为a,b,ca,b,c。不失一般性地令abca\le b\le cxyzx\oplus y\oplus z可能取到的数,满足cc以上的位全部与nn相同,cc位为00nncc位为11cc以下的位任意。考虑末cc位取到某个L[0,2c)L\in [0,2^c)的方案数,发现我们可以先让xx的末aa位、yy的末bb位随便取,然后根据x,yx,yLL唯一地确定zz的末cc位,故而方案数为2a+b2^{a+b}。这也就是说,枚举完a,b,ca,b,c之后,xyzx\oplus y\oplus z的每一个可能的取值出现的方案数是一样的。所以只需要求出所有的可能取到的数的dd次方的和就可以了。可能取到的数形成了一个连续的区间,是经典的自然数幂和问题。直接枚举a,b,ca,b,c计算的复杂度为O(dlog3n)O(d\log ^ 3 n),观察发现可取到的数形成的区间只与max{a,b,c}\max\{ a,b,c\}有关,所以只需要算logn\log n次自然数幂和就可以了,复杂度O(dlogn+log3n)O(d\log n + \log^3 n)


B - N门问题

题意

NN扇门中有一扇门是有奖的。初始的时候AA认为所有门有奖的概率是相等的。每一轮,AA会在有奖概率最大的门中随机选择一扇,然后主持人会从没有被AA选择且没有奖的所有门中随机选择一扇门打开。进行到第N1N-1轮时,AA的选择就是他的最终选择。

现在你来当主持人,你可以决定(而不是随机地)每一次打开哪一扇没有被AA选择且没有奖的门,问AA最终选择的门后面有奖的概率最小是多少。假定AA不知道你是托儿,即AA仍然认为你是在随机选择门。

N1018N\le 10^{18}


C - 区间匹配

题意

有两个长度为nn的序列a[1n],b[1n]a[1\cdots n],b[1\cdots n]和两个非负整数la,lb(lbla)la,lb(lb \le la),你需要求出一个11nn的排列{p}\{p\},使得对于所有ii都有a[i]b[p[i]]a[i]+laa[i] \le b[p[i]] \le a[i] + la,在此基础上你需要最大化满足a[i]+lbb[p[i]]a[i] + lb \ge b[p[i]]ii的数量,并输出最大化的结果。

n500000n\le 500000a[i],b[i],la,lb500000a[i],b[i],la,lb\le 500000,且保证存在合法的pp

Sol

考虑这样的一种贪心:从右到左考虑每一个aa的元素,确定与它匹配的b[p[i]]b[p[i]]。设现在还没有匹配过的元素中,最靠右的一个是b[x]b[x],以及最靠右且满足a[i]b[y]a[i]+lba[i] \le b[y] \le a[i]+lb的是b[y]b[y]。如果让a[i]a[i]匹配上b[y]b[y],剩下的点仍然存在合法的匹配,则让a[i]a[i]匹配b[y]b[y];否则让a[i]a[i]匹配b[x]b[x]

正确性证明:假设这样得到的不是最优解,考虑最优匹配中第一个与这样求出来的匹配不同的位置ii,如果ii匹配的既不是xx也不是yy,将ii匹配的改成xx或者yy,答案一定不会变劣;假设最优匹配中ii匹配了yy,则意味着让ii匹配yy之后仍然存在完备匹配,所以我们的贪心策略也会让ii匹配yy;而如果最优匹配中ii匹配了xx,我们的贪心策略让ii匹配了yy,设我们的贪心策略中匹配了xx的是qxq_x(显然qxq_x对答案没有贡献),而最优策略中qxq_x匹配zz,则有两种情况:

  1. zyz\le y,则qx,zq_x,z这一对有可能对答案产生了贡献,此时我们将最优决策改为xx匹配qxq_xii匹配yy,显然是不会变劣的。
  2. z>yz> y,则qx,zq_x,z这一对一定对答案没有贡献。继续考虑qzq_z和最优策略中qzq_z所匹配的ww,若wyw\le y就改成qxq_x匹配xxqzq_z匹配zzii匹配yy,答案不会变劣,因为用到的yy的右侧的点的集合是一样的,并且用到的yy的左侧的点(从ww变成了yy)没有向左移,而已经确定了的匹配的贡献也没有变小;否则,继续考虑qwq_w直到匹配的点在yy的左侧。

直接检查是否存在完备匹配是O(nlogn)O(n\log n)的(排序+贪心)。由Hall定理可得,存在完备匹配的条件是,不存在zz使得i[b[i]z]>j[a[j]+laz]\sum_{i} [b[i] \ge z] > \sum_{j} [a[j] + la \ge z]。用线段树维护每个zzi[b[i]z]j[a[j]+laz]\sum_{i} [b[i] \ge z] - \sum_{j} [a[j] + la \ge z]以及区间最小值,并支持区间+1/1+1/-1,即可在O(nlogn)O(n\log n)的时间内解决问题。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!