概述
题目传送门
暴 力 很 好 打 暴力很好打 暴力很好打
有没有人性,才给7分!!!
看 了 一 下 没 有 给 太 大 的 值 域 , 显 然 是 要 从 值 域 着 手 看了一下没有给太大的值域,显然是要从值域着手 看了一下没有给太大的值域,显然是要从值域着手
对 于 子 任 务 3 ( 和 正 解 有 关 ) 可 以 用 一 个 d p 解 决 对于子任务3(和正解有关)可以用一个dp解决 对于子任务3(和正解有关)可以用一个dp解决
d p [ i ] [ j ] 表 示 以 i 为 左 端 点 , j 为 右 端 点 的 最 小 的 差 值 dp[i][j]表示以i为左端点,j为右端点的最小的差值 dp[i][j]表示以i为左端点,j为右端点的最小的差值
d p [ i ] [ j ] = M i n ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , a b s ( a [ j ] − a [ i ] ) ) dp[i][j]=Min(dp[i-1][j],dp[i][j-1],abs(a[j]-a[i])) dp[i][j]=Min(dp[i−1][j],dp[i][j−1],abs(a[j]−a[i]))
对 于 子 任 务 4 , 可 以 根 据 抽 屉 原 理 , 对 于 小 于 m 区 间 直 接 的 直 接 暴 力 , 大 于 的 直 接 输 出 0 ( 因 为 值 域 , 还 是 整 数 , 肯 定 有 两 个 值 相 同 ) 对于子任务4,可以根据抽屉原理,对于小于m区间直接的直接暴力,大于的直接输出0(因为值域,还是整数,肯定有两个值相同) 对于子任务4,可以根据抽屉原理,对于小于m区间直接的直接暴力,大于的直接输出0(因为值域,还是整数,肯定有两个值相同)
根 据 抽 屉 原 理 , 很 显 然 可 以 发 现 一 个 结 论 : 如 果 一 个 区 间 的 长 度 为 x , 那 么 最 小 差 值 不 超 过 m / x 根据抽屉原理,很显然可以发现一个结论:如果一个区间的长度为x,那么最小差值不超过m/x 根据抽屉原理,很显然可以发现一个结论:如果一个区间的长度为x,那么最小差值不超过m/x
根 据 这 个 原 理 , 可 以 直 接 将 答 案 分 开 统 计 , 对 于 区 间 小 于 m 的 直 接 用 子 任 务 3 的 方 法 统 计 根据这个原理,可以直接将答案分开统计,对于区间小于sqrt m的直接用子任务3的方法统计 根据这个原理,可以直接将答案分开统计,对于区间小于m的直接用子任务3的方法统计
对 于 大 于 m , 可 以 发 现 相 减 值 域 是 一 个 比 较 小 的 值 , 从 这 方 面 下 手 对于大于sqrt m,可以发现相减值域是一个比较小的值,从这方面下手 对于大于m,可以发现相减值域是一个比较小的值,从这方面下手
r [ i ] 表 示 i 这 个 值 出 现 的 最 大 的 坐 标 , c h [ i ] 表 示 差 值 为 i 的 最 大 坐 标 r[i]表示i这个值出现的最大的坐标,ch[i]表示差值为i的最大坐标 r[i]表示i这个值出现的最大的坐标,ch[i]表示差值为i的最大坐标
枚 举 右 端 点 , 这 两 个 就 很 好 转 移 了 , 具 体 看 代 码 枚举右端点,这两个就很好转移了,具体看代码 枚举右端点,这两个就很好转移了,具体看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define ll long long
int n,m,k,a[N],s,r[N];
int ch[N];ll f[N],ans;
int main()
{
freopen("blueming.in","r",stdin);
freopen("blueming.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
memset(f,127,sizeof(f));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
s=floor(sqrt(m));
for(int i=2;i<=s;i++)
for(int j=1;j+i-1<=n;j++){
f[j]=min(f[j],min(f[j+1],1ll*abs(a[j]-a[j+i-1])));
if(i>=k)ans=max(ans,f[j]*(i-1));
}
for(int i=1;i<=n;i++){
int up=m/s;
for(int j=0;j<=up+1;j++){
ll u=a[i]+j,v=a[i]-j;
if(j>=1)ch[j]=max(ch[j],ch[j-1]);
if(u<=m)ch[j]=max(ch[j],r[u]);
if(v>=1)ch[j]=max(ch[j],r[v]);
if(i-ch[j]+1>max(s,k))ans=max(ans,1ll*(i-ch[j]-1)*(j+1));
}r[a[i]]=i;
}
printf("%lld",ans);return 0;
}
最后
以上就是要减肥苗条为你收集整理的uoj套路题目传送门的全部内容,希望文章能够帮你解决uoj套路题目传送门所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复