CF1923 Educational Codeforces Round 162 (Rated for Div. 2)

C.Find B

给出一个数组A,对于q个询问,每个询问给出[l,r],对于A的子数组[l,r],问是否存在一个相同大小的数组B,使得两个数组的和相同,且任意相同下标的元素不同?

Solution:
A中任意一个大于1的元素,可以把他变成1,多余的那部分给到其他位置的元素上(如最后一个)
对于等于1的元素,把他变成不同的最小代价是把他变成2.多余的部分再给到其他元素就可以了.
因此用前缀和记录区间内1的个数d[i],最后看 d[i]*2 + 剩余元素个数是否大于等于区间元素的和即可.

赛时这道题没有想透彻,WA了很多发.

D. Slimes

有一排粘液,如果任意相邻的两个粘液是严格不等的,那么大的就可以吃掉小的,并且大小变为两个粘液的和.每秒只有一个粘液被吃,问每个粘液被吃的可能的最短时间是多少?

Solution:

注意这道题既可以向左吃也可以向右吃

若一个粘液 \(i\) 被吃,那一定是通过其相邻的粘液过来的.也就是说,吃的那一方,组成它的序列是连续的,且是 \([j,i-1]\)\([i+1,j]\).

一个序列组成的粘液,花费的时间总是这个区间的长度.

先考虑\([i+1,j]\)(也就是j在i的右边)的情况,另一种[j,i-1]的情况只需要反过来即可.

如果这个区间内元素全是相同的,那么相当于只有最靠近i的那一个元素会对答案有影响,为了方便处理我这里直接对最靠近i的元素先处理一下,如果能吃掉,那么 $ans[i] = 1 $ 即可.假如\(a[i+1],a[i+2]...a[k]\)是相同的,后面我们枚举区间的时候就不要再枚举 $[i+1,i+1] $到 \([i+1,k]\) 这段区间了,因为是无效区间.那么怎么跳过这段区间,这又是我想不到的一个难点.

我们可以记录位置 \(i\) 的下一个与之不同的元素的下标 \(k\) ,从 \(k+1\) 开始二分就好了

如果元素不是全都相同的,那么可达到的粘液大小一定是区间元素的和,一定可以构造出这种吃法

显然当 \([i+1,j]\) 能吃掉i时,\([i+1,j+1]\) 也可以吃掉,并且后者的体积一定严格大于前者,所以可以二分来做.
二分位置 \(j\) ,使得 \([i+1,j]\) 的粘液们可以吃掉 \(i\).

算法:前缀和,二分

posted @ 2024-02-26 19:31  LZH_03  阅读(15)  评论(0编辑  收藏  举报