CF乱写3

还是\(Div2\),都是打过或补上的赛题,差不多就是\(CF \# 800\)以后的
开写开写

1705A

简单贪心
使用std::sort升序排序
如果\(\exist i,a_i+x>a_{i+n}\)显然无解

1705B

对于每个\(i,\)记录最近一个\(last,a_{last}\not =0\)
如果\(a_i=0,\)就让\(a_{last}\)转移一个\(1\)\(a_i\),答案数加一
最后再把整个改完后的\(a\)数组所有值扔进答案即可

1705C

\(l,r\in [0,1e18]\)显然不能暴力复制
但是我们可以记录下来一个位置是从哪些区间的字符复制过来的
然后就是暴力std::lower_bound去跳区间直到跳到原字符串的位置

1705D

设刚开始字符串为 \(a\),结束时字符串为\(b\)
我们可以发现,如果$ a[1]\not=b[1]$] 或 \(a[n]\not=b[n]\),那么就一定无解。
否则我们可以发现,操作本质上是将一个全为 $1 $的极大子串增长或缩短,
但是两个子串不能合并,当然也不能调换位置顺序
所以,我们分别求出 \(a\)\(b\)中的全为$ 1$ 的极大子串的数量即可,
如果它们不相等就无解。
否则,对于两边对应的极大子串,分别求出左端点和右端点的移动的距离即可。

1708B

就是构造的时候,\(gcd(a_i,i)\)互不相同
有一个性质就是\(gcd(i,a_i)\leq i\)
抓住一个关键信息就是\(i\)互不相同
所以考虑在\([l,r]\)里找\(i\)的倍数
因为只有这样构造出的数列一定满足\(gcd(a_i,i)\)互不相同
否则因为鸽巢原理一定会撞上前面已经出现的公约数
所以直接判断\([l,r]\)里有没有\(i\)\(i\)的倍数即可
但是赛时写挂了FST了

1707A

一道好题
这个题赛时没有切掉
赛后看了题解感觉很神奇,二分决策
分析得知,最优决策中必然存在一个点,这个点的后面全部都选,前面只选大于智商的
以下是Totorial翻译:
对于任何情况,必然存在最后一场不考的和第一场掉智的
如果掉智的比不考的先考,可以放掉不考的选先考的,这是一样优的
否则,这个决策点就是存在的
于是只需要二分答案求出最靠前的这个点,此时是最优方案

1709D

讲D的原因是我C到现在不会
这个题就是说一种较优的决策就是下\(\to\)平移\(\to\)
平移一定是再往下走会出活动空间再停止
否则你可能就会提前撞到炸弹
不满足条件的可能性在于上下之间和平移过程中
1.上下之间:
上下之间不满足情况的就是作差\(\bmod k\)不为\(0\)
2.平移
平移可能会出现两种情况:
1.左右平移的距离不是\(k\)的倍数
2.平移的时候最优的路径被炸弹封死了
发现三个条件有两个是好判断的
如何判定\(2.2\)是否成立?需要去看沿路炸弹最大值
如果封死(最优路径也会穿过炸弹)就不行,
此时炸弹的深度\(\geq\)机器人走到最深位置的深度
写个数据结构维护区间最大值即可
然后就是好像有点卡常?

posted @ 2022-08-06 07:03  2K22  阅读(25)  评论(0)    收藏  举报