牛客小白月赛110(EF)

E

比较有意思的思维题

按下标可以分为若干个组,先对每组内升序排序,再按值排序,一定是最优的。目前还不太会证明,以后有机会再补充证明,具体细节见代码。

code

F

双指针 + 模运算式推导

首先特判掉 x=0 的情况,因为只有不含0的数组才符合要求,所以只需要将所有 a[i]=0 改为非0值即可。

若区间 [l,r] 不满足约束条件,即:

mulrmull1modp=x

考虑将式子变换成:

mulr=(x+kp)mull1(kZ)

mulrx+kp=mull1

mulrinv(x+kp)=mull1

其中

inv(x+kp)=qpow(x+kp,p2,p)=(x+kp)p2modp=xp2modp=inv(x)

因此:

mulrinv(x)=mull1

x 是固定的,对于任意固定右端点 r 的区间,只需要看其前缀是否有满足上式的左端点即可。

x0 时,对于任意包含0的子区间均满足条件。因此对于不合法区间,只需要将某个元素修改为0即可。

用双指针 l,r 来遍历,每次看右端点为 r 的所有子区间 [l,r]是否均满足要求(l 范围在 r 之前的第一个 a[i]=0 的后一个位置),若存在不满足要求的左端点,则贪心地将最右侧端点 a[r] 赋为0即可(容易证明这样一定最优,因为保证了前面的同时,后面的区间范围更小了),并将 l 的范围更新成 >=r+1。具体细节见代码。

code

posted @   jxs123  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩