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\).
算法:前缀和,二分
标签:二分,Educational,Rated,相同,CF1923,元素,吃掉,区间,粘液 From: https://www.cnblogs.com/oijueshi/p/18034949