学好二分,走遍天下都不怕..
以后不直接放代码了,太水字数了,这样不好评价自己的训练量
卡了很久..
本来直接维护一个val[i]表示i当前的值,然后一路扫过去
如果当前清零就回过去把之前不为0的都清零,是均摊 的
但是写挂了,然后就换了个很麻烦的方式来维护..
submission
没有看到太好懂的,,还是官方题解看起来方便..
以下算是翻译了..
考虑 ,
其中
这个值就是
前者是 到任意端点 再到 ,后者是 直接到 的方案
对于一个区间,当区间长度增大时,区间的最小值只会减小
考虑所有 ,
其中 ,这里的最大值,所求的直径就是
即
二分这个直径ans,check最小操作数,如果 ,就把它变到 1e9
如果超出k,那就寄了
如果没有剩余,就计算一遍直径,否则讨论还有剩余的情况
如果剩一个操作数,可以找到一个最大的 ,操作它旁边的数字,使得 最大化,满足条件,如果剩余的有两个以上,就可以制造相邻的 1e9
最大化 ,因此都是满足的
这样就可以计算最小步骤了..
submission..
E. LCM Sum
给定t组数据,每组给定 ,有
求
Easy Version:
反过来计算 的数量,因为
所以统计
的数量,然后用总数减掉就是答案
维护所有数的所有因子,然后 check一下即可
submission
Hard Version:
离线处理所有询问
按右端点从小到大考虑,统计完 内的数量后,就减去
内的数量,用个点修区间查的结构即可
submission