Good Bye 2019 题解

文章目录

Solutions

A

令 A 的牌的最大标号为 x x x,B 的牌的最大标号为 y y y。可以发现,A 获胜当且仅当 x > y x>y x>y,否则 B 胜利。

B

我们只需要判断所有相邻的数 ( a i , a i + 1 ) (a_i,a_{i+1}) (ai,ai+1) 是否满足 ∣ a i − a i + 1 ∣ ≥ 2 |a_i-a_{i+1}| \ge 2 aiai+12 即可。

简要证明: 若 ∀ i ∈ [ 1 , n ) \forall i \in [1,n) i[1,n) 总有 ∣ a i − a i + 1 ∣ = 1 |a_i-a_{i+1}|=1 aiai+1=1,那么对于任意非空区间 [ l , r ] [l,r] [l,r],令其最大值为 a x a_x ax,最小值为 a y a_y ay,则 a x − a y ≤ ∣ x − y ∣ ≤ r − l < r − l + 1 a_x-a_y \le |x-y| \le r-l<r-l+1 axayxyrl<rl+1,即 a x − a y a_x-a_y axay 小于了区间长度 r − l + 1 r-l+1 rl+1。证毕。

C

令给定的序列的和为 x x x,异或和为 y y y;添加进来的若干个数的和为 u u u,异或和为 v v v,则 x + u = 2 ( y ⊕ v ) x+u=2(y \oplus v) x+u=2(yv),其中 ⊕ \oplus 代指异或。

现在关键在于,给定 u , v u,v u,v,构造出不超过三个数使和为 u u u,异或和为 v v v。从低位往高位考虑。对于每一个扫描到的位,我们需要保证 u u u v v v 在二进制表示下该位的值相同,否则无法对于该位构造。具体来说,若当前这一位上 u , v u,v u,v 分别为 0 , 0 0,0 0,0,则我们可以给三个数的该位填上 ( 0 , 0 , 0 ) / ( 0 , 1 , 1 ) (0,0,0)/(0,1,1) (0,0,0)/(0,1,1);若分别为 1 , 1 1,1 1,1,则填上 ( 0 , 0 , 1 ) / ( 1 , 1 , 1 ) (0,0,1)/(1,1,1) (0,0,1)/(1,1,1),至于填哪个与接下来的位上两个值是否相同有关。

这样我们就成功地构造出了一个三个数的解,但要求是 u , v u,v u,v 同奇同偶(如果最低位不同那么构造个锤子)。于是分类讨论: 若 x x x 为偶,则 u u u 为偶且 v = 0 v=0 v=0 x x x 为奇则 u u u 为奇,且 v = 1 v=1 v=1

本题被解决,单次 O ( 1 ) O(1) O(1)

D

我们仅考虑前 k + 1 k+1 k+1 个数,并通过 ( k + 1 k ) = k + 1 { {k+1} \choose k}=k+1 (kk+1)=k+1 次查询,对于每一个由前 k + 1 k+1 k+1 个数组成的大小为 k k k 的集合求出了其第 m m m 小值。

不难发现,对于前 k + 1 k+1 k+1 个数的第 m m m 小值,其出现了 k + 1 − m k+1-m k+1m 次;第 m + 1 m+1 m+1 小值出现了 m m m 次。于是,答案即为较大数出现的次数。

时间复杂度 O ( k 2 ) O(k^2) O(k2)

E

构造题真的做不出来,ducati 菜死了。

为方便叙述,下面令距离为两点的欧氏距离的平方

考虑从奇偶性入手。令 c u , v = { i ∣ x i m o d    2 = u , y i m o d    2 = v } c_{u,v}=\{i|x_i \mod 2=u,y_i \mod 2=v\} cu,v={ iximod2=u,yimod2=v}

  • ①对于在某个 c u , v c_{u,v} cu,v 内部的边,其距离为 4 4 4 的倍数。
  • ②对于跨越 c 0 , 0 , c 1 , 1 c_{0,0},c_{1,1} c0,0,c1,1 c 1 , 0 , c 0 , 1 c_{1,0},c_{0,1} c1,0,c0,1 的边,其距离除以 4 4 4 2 2 2
  • ③对于跨越 c 0 , 0 , c 1 , 0 c_{0,0},c_{1,0} c0,0,c1,0 c 0 , 0 , c 0 , 1 c_{0,0},c_{0,1} c0,0,c0,1 c 0 , 1 , c 1 , 1 c_{0,1},c_{1,1} c0,1,c1,1 c 1 , 0 , c 1 , 1 c_{1,0},c_{1,1} c1,0,c1,1 的边,其距离除以 4 4 4 1 1 1

直观的,令 A = c 0 , 0 ∪ c 0 , 1 , B = c 1 , 0 ∪ c 1 , 1 A=c_{0,0}∪c_{0,1},B=c_{1,0}∪c_{1,1} A=c0,0c0,1,B=c1,0c1,1,那么跨越 A , B A,B A,B 的边长为奇,否则为偶。

本题真的就这么被解决了吗?当然没有,这样虽然满足了 ⌈ \lceil 同长度的边同色 ⌋ \rfloor ,但可能并不满足 ⌈ \lceil A , B A,B A,B 非空 ⌋ \rfloor

因此,我们需要考虑 c 1 , 0 = c 1 , 1 = ∅ c_{1,0}=c_{1,1}=∅ c1,0=c1,1= c 0 , 0 = c 0 , 1 = ∅ c_{0,0}=c_{0,1}=∅ c0,0=c0,1= 的情况。若为前者, A = c 0 , 0 , B = c 0 , 1 A=c_{0,0},B=c_{0,1} A=c0,0,B=c0,1;若为后者, A = c 1 , 0 , B = c 1 , 1 A=c_{1,0},B=c_{1,1} A=c1,0,B=c1,1。不难发现,一个组内部的边长除以 4 4 4 0 0 0,跨组的边长除以 4 4 4 2 2 2

本题真的就这么被解决了吗?当然没有,这样虽然满足了 ⌈ \lceil 同长度的边同色 ⌋ \rfloor ,但可能并不满足 ⌈ \lceil A , B A,B A,B 非空 ⌋ \rfloor

因此,我们还需要考虑所有 x i x_i xi 在模 2 2 2 意义下相等,且 y i y_i yi 在模 2 2 2 意义下依然相等的情况。考虑做一个等效变换: 将它们全部除以 2 2 2 向下取整。然后递归处理即可。

可以证明,总有一个时刻, c u , v c_{u,v} cu,v 中有不小于两个非空集合。

本题被解决,时间复杂度 O ( n log ⁡ m ) O(n \log m) O(nlogm),其中 m m m 为值域的上界。

F

p r e i = ∑ j = 1 i a j pre_i=\sum_{j=1}^i a_j prei=j=1iaj,则 r − l + 1 r-l+1 rl+1 [ l , r ] [l,r] [l,r] 的和的倍数,等价于存在某个 k k k 使得 r − l + 1 = k ( p r e r − p r e l − 1 ) r-l+1=k(pre_r-pre_{l-1}) rl+1=k(prerprel1)

考虑对 k k k 进行根号分治。令分水岭为 B B B

Part 1

k ≤ B k \le B kB 时,合法的 k k k 的数量并不多。这启发我们枚举 k k k,并求出此时的 ( l , r ) (l,r) (l,r) 对数。

我们将式子拆开,使得左右两边分别仅仅与 l , r l,r l,r 有关。

r + 1 − k p r e r = l − k p r e l − 1 r+1-kpre_r=l-kpre_{l-1} r+1kprer=lkprel1

f r = r + 1 − k p r e r f_r=r+1-kpre_r fr=r+1kprer g l = l − k p r e l − 1 g_l=l-kpre_{l-1} gl=lkprel1,则贡献为 f , g f,g f,g 中相等的位置对数。

该如何快速求出这样的对数呢?我们可以开一个大小为 O ( n B ) O(nB) O(nB) 的数组作为桶,对于每一个 f i f_i fi f i + △ f_i+\triangle fi+ 放到桶里面去,那么贡献就是所有 g i + △ g_i+\triangle gi+ 的和。这里的 △ \triangle 是一个足够大的数,以保证下标非负。注意,要在处理完当前的 k k k 时清桶。

复杂度 O ( n B ) O(nB) O(nB)

Part 2

k k k 较大的时候,区间和较小(不超过 ⌊ n B ⌋ \lfloor \frac n B \rfloor Bn)。这启发我们将序列中的 1 1 1 的位置从小到大排列(令得到的序列为 c c c,且 c 0 = 0 , c L + 1 = n + 1 c_0=0,c_{L+1}=n+1 c0=0,cL+1=n+1,其中 L L L 为原序列中 1 1 1 的数量),并枚举长度不超过 ⌊ n B ⌋ \lfloor \frac n B \rfloor Bn 的区间 c [ l , r ] c[l,r] c[l,r],累加区间的贡献。

[ l , r ] [l,r] [l,r] 的贡献该如何计算呢?若令 u u u c l c_l cl 往左扩展的距离, r r r c r c_r cr 往右扩展的距离,那么贡献为满足 u ∈ [ 0 , c l − c l − 1 ] , v ∈ [ 0 , c r + 1 − c r ] u \in [0,c_l-c_{l-1}],v \in [0,c_{r+1}-c_r] u[0,clcl1],v[0,cr+1cr] 使得 u + v + ( c r − c l + 1 ) u+v+(c_r-c_l+1) u+v+(crcl+1) r − l + 1 r-l+1 rl+1 的超过 B B B 倍的 ( u , v ) (u,v) (u,v) 对数,可以线性计算出。常数很大就是了

从而,区间一共 n 2 B \dfrac {n^2} B Bn2 个,于是这一部分的复杂度是 O ( n 2 B ) O(\dfrac {n^2} {B}) O(Bn2)


B = n B=\sqrt n B=n ,总复杂度 O ( n n ) O(n \sqrt n) O(nn ),本题被解决。

蒟蒻 ducati 一直都是在做对某个已给的值搞根号分治的题目,然而没有做过对倍数 k k k 根号分治的题目,想不到枚举暴露了菜鸡的本质啊。

G

一道非常妙的题目,我当然做不出来。

首先,看到 i − n ≤ a i ≤ 1 i-n \le a_i \le 1 inai1,考虑将其移项变为 1 ≤ i − a i ≤ n 1 \le i-a_i \le n 1iain

考虑对于每一个 i i i i − a i i-a_i iai 连边,得到了一个基环内向树。可以发现,其唯一的环上的点即为一个和为0的集合,因为环上节点编号减去所有 a i a_i ai 的和依然等于环上节点编号之和,所以 a i a_i ai 的和就是 0 0 0 啦。

可以把内向树当成无向树来处理,并通过并查集加边将成环的时刻记录下来,最后在树上跳父亲得到环上的点。

H

3300 × 3300\times 3300× 的题目是真的无力回天啊。不过看了题解感觉这题并没有狂难,还是有必要补一下的。

首先,注意到,一个连通块必然是一个区间。

其次,连通块的数量 1 1 1,就是满足 [ 1 , i ] ( i , n ] [1,i](i,n] [1,i](i,n] 之间两两无边的 i i i 的数量。

接着,考虑令 x = max ⁡ j = i + 1 n { a j } x=\max_{j=i+1}^n \{a_j\} x=maxj=i+1n{ aj},并将所有小于 x x x a j a_j aj 改为 0 0 0,其他改为 1 1 1,那么序列必须形如 11111 ⋯ 0000000 11111\cdots0000000 111110000000 x x x 才能产生贡献。令这种形式的序列为优秀序列。那么,根据元素两两不同, i i i 的数量,就是满足 j j j 在序列中出现过且 j j j 对应的 01 01 01 序列优秀 j j j 的数量。

综上所述,我们对于每一个 j j j 维护其 01 01 01 序列中相邻的 ( 1 , 0 ) (1,0) (1,0) 对数,以及 x x x 是否出现过。这样,问题等价于区间修改,查询整体最小值出现次数,可以用线段树维护。注意边界 a 0 = ∞ , a n + 1 = − ∞ a_0=∞,a_{n+1}=-∞ a0=,an+1=

总复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn),本题被解决。

I

看到 3500 × 3500 \times 3500× 就跑了,感觉完全不可做。

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/119618044