Codeforces Round #792 A~G

难度D>E>G>F>B>C>A

A

当n>=3时都可以先把min换到位置2,然后随便找两个换,直到n=2时换12,输出min
否则n=2时只能直接换,输出a[2]

B

我写的是a+b*c,b,c,当然也可以直接a+b+c,b+c,c

C

随便找一个不合法的对(i,j)和(i,j+1),则显然要动至少一个
所以暴力换一列就可以了,维护一下相邻的不合法对数

D

非常妙的贪心
考虑把跳操作改一下,改为对当前位置减a[i],然后对后面的加1
发现这样和原操作的区别在于第j个跳的位置会多加j-1
所以枚举跳的总次数k,多出来的就是k(k-1)/2,初始全部都不跳,之后按-a[i]+(n-i)排序跳

E

枚举mex,然后要使diff最小
其实就是用>=mex的数来填0~mex-1,则每次用个数最小的那个来填会使diff最小
每次mex+1时可能要把原来选了的弹掉,然后继续选
列出diff的计算式然后维护即可,细节比较多

F

和two pointer没什么关系的做法
记i位置的a[i]的上一个出现位置为pre[i],用扫描线求出所有有影响的(pre[i],i)
然后相当于选一个矩形覆盖,使得所有(x,y)至少有x或y被覆盖
那么对于每个(x,y),显然有ans=[L,R],使得R>=x,L<=y
这样做会得到一个[L,R],满足剩下还未覆盖的(x,y)一定是x<L,R<=y,即横跨过[L,R]
然后对剩下的(x,y)排序,枚举x维护min(y),可以用two pointer

G

大力观察,发现当t<=m/3时可以直接(3t,2t)解决,所以ti<=m/3可以当作资源来用,最后统一处理
再观察发现若t>=m/2,则a>b>t,因为a>b所以a>=b+t>m,所以如果t>=m/2就直接寄了
现在把t∈[1,m/3]和t∈(m/3,m/2)的分成AB两类,现在要把所有的B类解决

假设某个B类的t,其不能直接作为终点结束,因为至少要a=3t,所以要往后除下去
设t是c,前两个是ab,后面的一个是d,则根据c>m/3,a<=m的约束只能是a=b+c,b=c+d
假设c%d≠0,那么会继续下去直到得到gcd(c,d),此时c%gcd(c,d)=0,中间过程的数都要消耗
由于A类的数是消耗品,发现这样做不如直接选gcd(c,d),可以省掉中间的消耗,所以c%d≠0时不优,故c%d=0
所以问题变成选满足约数关系的AB类匹配,同时还要有a<=m,即2c+d<=m,连边跑匈牙利即可构造

posted @ 2022-08-10 16:40  gmh77  阅读(38)  评论(0)    收藏  举报