UOJ246 【UER7】 套路
Description
定义区间权值的 表示
给定序列 ,求最大的
Solution
可以通过 得到:
全题的 Key observation 由抽屉原理得到:
那么使用根号分治来做:
-
对于区间长度 的部分按照上面的 式子暴力求 在更新答案
-
对于区间长度比较大的部分,可以枚举 的数值,对于每个右端点计算满足条件的最小左端点
对于当前枚举的 ,设 表示最小的满足 的位置,转移给 可以通过消去差为 的位置,即
时间复杂度
Code
const int N=2e5+10,B=500;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,m,K,a[N],S[N],lef[N],app[N];
signed main(){
n=read(); m=read(); K=read();
rep(i,1,n) a[i]=read(),S[i]=inf;
int ans=0;
for(int len=1;len<=B;++len){
for(int i=1;i<=n-len;++i){
ckmin(S[i],min(S[i+1],abs(a[i]-a[i+len])));
if(len>=K-1) ckmax(ans,len*S[i]);
}
}
rep(j,0,B) lef[j]=1;
for(int i=1;i<=n;++i){
for(int j=0;j<=B;++j){
if(i-lef[j]+1>=K) ckmax(ans,j*(i-lef[j]));
ckmax(lef[j+1],lef[j]);
if(a[i]+j<=m) ckmax(lef[j+1],app[a[i]+j]+1);
if(a[i]-j>=1) ckmax(lef[j+1],app[a[i]-j]+1);
}
app[a[i]]=i;
}
print(ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律