CF1270

A. Card Game

比较最大值即可

B. Interesting Subarray

给出长度为nn的序列aia_i,问是否存在一个子区间[l,r][l, r]满足maxi=lraimini=lrairl+1\max_{i=l}^{r} a_i - \min_{i=l}^{r} a_i \ge r - l + 1

n2105n \le 2 * 10^5


考场上写了个比较复杂的做法,实际上只需要检验所有相邻两个位置是否满足即可

C. Make Good

给出一个长度为nn的序列aia_i,你需要在末尾添加d(d3)d(d \le 3)个数,使得i=1n+dai=2i=1n+dai\sum_{i=1}^{n+d} a_i = 2 * \bigoplus_{i=1}^{n+d} a_i

n105n \le 10^5


只需要添加一个数XX. 设原序列的和为S1S_1,异或和为S2S_2

乘二相当于二进制下左移一位,于是从低到高位考虑,若S1S_1该位上的值不等于S2S_2下一位上的值,则调整XX,使得S2S_2的下一位变成S1S_1该位的值

D. Strange Device

交互题.

有一个长度为nn的序列aia_i,和参数m,km, k

给出nnkk,你可以向交互库询问一个大小为kk的下标集合,交互库会返回这个下标集合中权值第mm小的数的下标和权值

用不超过nn次询问求出mm

1k<n5001 \le k < n \le 500


[交互]

考场降智,没做出来

询问k+1k+1次,第ii次询问[1,i)(i,k+1][1, i) \cup (i, k+1]这个集合。总共会返回两种不同的值,其中较大的那个值的出现次数就等于mm

证明略

E. Divide Points

平面上 nn 个互不相同的点,要求分成两个非空集合,使得不存在一种点对之间的距离长度 xx 满足 xx 既可以被同一集合内的两个点连出,又可以被跨集合的两个点连出。

n103,106xi,yi106n \le 10^{3}, -10^{6} \le x_{i},y_{i} \le 10^{6}


[构造]

考虑按 x+yx + y 的奇偶性分集合,显然能够满足题意。但是这样分出来不一定满足集合非空,于是考虑 x+yx + y 均为偶的情况怎么做。为奇的时候可以平移成为偶的情况。

不断旋转并缩小坐标系,即 (x,y)(x+y2,xy2)(x, y) \Rightarrow (\frac{x+y}{2}, \frac{x-y}{2}) (类似于曼哈顿转切比雪夫距离),再检查此时是否所有点 x+yx + y 的奇偶性相同。若不全相同则输出答案,否则继续旋转缩小。这样最终一定可以区分出两个集合。

感性理解一下正确性

因为在旋转缩小坐标系时,一定是成比例缩小的,所以任意两个点的坐标一定不相同

但是如果无穷无尽地缩小的话,点坐标会越来越接近(0,0)(0, 0),会越来越趋近相等,所以会在相等前的那一次缩小被分出奇偶性

F. Awesome Substrings

定义一个区间 [l,r][l, r] 是好的,当且仅当rl+1r - l + 1[l,r][l, r]11的个数的倍数

给出一个长度为nn的01串,统计好区间的个数

n200000n \le 200000


[根号平衡]

考虑固定右端点rr统计答案,若区间[l+1,r][l + 1, r]合法,则需要满足 rl=k(sumrsuml)r - l = k \cdot (sum_r - sum_l). sumisum_i表示前缀和数组

发现要统计l,kl, k这两维的信息,考虑根号平衡,设参数TT

  1. kTk \le T:

    lksuml=rksumrl - k \cdot sum_l = r - k \cdot sum_r. 枚举kk,用个桶统计合法ll的个数即可

    复杂度O(nT)O(n\cdot T)

  2. k>Tk > T:

    sumrsuml=rlknT\displaystyle sum_r - sum_l = \frac{r - l}{k} \le \frac{n}{T}. 枚举sumlsum_l,则得到对应的ll的范围,统计存在其中存在多少个合法kk即可

    复杂度O(nnT)O(n \cdot \frac{n}{T})

TT取根号时最优,复杂度O(nn)O(n\sqrt n)

G. Subset with Zero Sum

给出一个长度为nn的序列aia_i,满足inaii1i - n \le a_i \le i - 1

找出一个下标集合 ,满足

n106n \le 10^6


[构造] [思维]

好巧妙的一道构造题.

题目条件转化为 1iain1 \le i - a_i \le n,即i(iai)i \rightarrow (i - a_i)会构成一棵基环内向树,考虑把环 提出来会发生什么

i1ai1=i2i2ai2=i3ikaik=i1 \begin{aligned} i_1 - a_{i_1} &= i_2 \\ i_2 - a_{i_2} &= i_3 \\ &\vdots \\ i_k - a_{i_k} &= i_1 \\ \end{aligned}

把上述式子相加,发现

H. Number of Components

「CF1270H」Number of Components - 线段树