CF1270
A. Card Game
比较最大值即可
B. Interesting Subarray
给出长度为n的序列ai,问是否存在一个子区间[l,r]满足maxi=lrai−mini=lrai≥r−l+1
n≤2∗105
考场上写了个比较复杂的做法,实际上只需要检验所有相邻两个位置是否满足即可
C. Make Good
给出一个长度为n的序列ai,你需要在末尾添加d(d≤3)个数,使得∑i=1n+dai=2∗⨁i=1n+dai
n≤105
只需要添加一个数X. 设原序列的和为S1,异或和为S2
乘二相当于二进制下左移一位,于是从低到高位考虑,若S1该位上的值不等于S2下一位上的值,则调整X,使得S2的下一位变成S1该位的值
D. Strange Device
交互题.
有一个长度为n的序列ai,和参数m,k
给出n和k,你可以向交互库询问一个大小为k的下标集合,交互库会返回这个下标集合中权值第m小的数的下标和权值
用不超过n次询问求出m
1≤k<n≤500
[交互]
考场降智,没做出来
询问k+1次,第i次询问[1,i)∪(i,k+1]这个集合。总共会返回两种不同的值,其中较大的那个值的出现次数就等于m
证明略
E. Divide Points
平面上 n 个互不相同的点,要求分成两个非空集合,使得不存在一种点对之间的距离长度 x 满足 x 既可以被同一集合内的两个点连出,又可以被跨集合的两个点连出。
n≤103,−106≤xi,yi≤106
[构造]
考虑按 x+y 的奇偶性分集合,显然能够满足题意。但是这样分出来不一定满足集合非空,于是考虑 x+y 均为偶的情况怎么做。为奇的时候可以平移成为偶的情况。
不断旋转并缩小坐标系,即 (x,y)⇒(2x+y,2x−y) (类似于曼哈顿转切比雪夫距离),再检查此时是否所有点 x+y 的奇偶性相同。若不全相同则输出答案,否则继续旋转缩小。这样最终一定可以区分出两个集合。
感性理解一下正确性
因为在旋转缩小坐标系时,一定是成比例缩小的,所以任意两个点的坐标一定不相同
但是如果无穷无尽地缩小的话,点坐标会越来越接近(0,0),会越来越趋近相等,所以会在相等前的那一次缩小被分出奇偶性
F. Awesome Substrings
定义一个区间 [l,r] 是好的,当且仅当r−l+1 是 [l,r]中1的个数的倍数
给出一个长度为n的01串,统计好区间的个数
n≤200000
[根号平衡]
考虑固定右端点r统计答案,若区间[l+1,r]合法,则需要满足 r−l=k⋅(sumr−suml). sumi表示前缀和数组
发现要统计l,k这两维的信息,考虑根号平衡,设参数T
若 k≤T:
l−k⋅suml=r−k⋅sumr. 枚举k,用个桶统计合法l的个数即可
复杂度O(n⋅T)
若 k>T:
sumr−suml=kr−l≤Tn. 枚举suml,则得到对应的l的范围,统计存在其中存在多少个合法k即可
复杂度O(n⋅Tn)
T取根号时最优,复杂度O(n√n)
G. Subset with Zero Sum
给出一个长度为n的序列ai,满足i−n≤ai≤i−1
找出一个下标集合,满足
n≤106
[构造] [思维]
好巧妙的一道构造题.
题目条件转化为 1≤i−ai≤n,即i→(i−ai)会构成一棵基环内向树,考虑把环提出来会发生什么
i1−ai1i2−ai2ik−aik=i2=i3⋮=i1把上述式子相加,发现
H. Number of Components
「CF1270H」Number of Components - 线段树