题目传送门

官方题解传送门

一句话题意的话就是给定一个序列,从中找出至少$k$个连续的元素形成子序列,使得子序列中任意两个元素差值的最小值于其长度-1的乘积最大。

题目中给出了$ 1 \leq a_i \leq m$,然后再往深处想想可以得到长度大于$m$的子序列答案一定为$0$,所以如果是DP的话就只需要把序列长度枚举到$m$就够了。

然后他们说对于长度为$x$的序列,答案不可能超过$\frac{m}{x-1}$,根据这个性质就可以根据$k$的规模进行分段处理,首先设一个常数$S$,根据本题$m$的规模把$S$设到$500$(题解上讲设为$\sqrt{m}$,但是几乎所有人都是设为了$500$,可能更方便处理)。如果$k \leq S$,就先跑一遍DP。

然后对于$k>S$的,重新设一个数组$r_x$表示对于当前枚举到的位置,距离当前最近的值为$x$的坐标,随着枚举不断更新就好了。

//UOJ 246
//by Cydiater
//2016.10.17
#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define ll long long
#define up(i,j,n)		for(int i=j;i<=n;i++)
#define down(i,j,n)		for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
const ll MAXN=1e6+5;
const ll oo=1LL<<60;
const ll S=500;
inline ll read(){
	char ch=getchar();ll x=0,f=1;
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
ll r[MAXN],N,M,K,a[MAXN],ans=0,minn[MAXN],pos[MAXN];
namespace solution{
	void init(){
		N=read();M=read();K=read();
		up(i,1,N)a[i]=read();
	}
	void slove(){
		memset(minn,0x3f,sizeof(minn));
		up(len,2,S)up(st,1,N){
			ll nd=st+len-1;if(nd>N)break;
			cmin(minn[st],min(minn[st+1],abs(a[nd]-a[st])));
			if(len>=K)cmax(ans,minn[st]*(len-1));
		}
		up(i,1,N){
			up(j,0,S){
				if(j>0)cmax(pos[j],pos[j-1]);
				if(a[i]+j<=M)cmax(pos[j],r[a[i]+j]);
				if(a[i]-j>=1)cmax(pos[j],r[a[i]-j]);
				if(i-pos[j]>=K)cmax(ans,(i-pos[j]-1)*(j+1));
			}
			r[a[i]]=i;
		}
	}
	void output(){
		cout<<ans<<endl;
	}
}
int main(){
	//freopen("input.in","r",stdin);
	using namespace solution;
	init();
	slove();
	output();
	return 0;
}

UOJ#246. 【UER #7】套路的更多相关文章

  1. 【UOJ#246】套路(动态规划)

    [UOJ#246]套路(动态规划) 题面 UOJ 题解 假如答案的选择的区间长度很小,我们可以做一个暴力\(dp\)计算\(s(l,r)\),即\(s(l,r)=min(s(l+1,r),s(l,r- ...

  2. 【UOJ #246】【UER #7】套路

    http://uoj.ac/contest/35/problem/246 神奇!我这辈子是想不出这样的算法了. 对区间长度分类讨论:题解很好的~ 我已经弱到爆了,看完题解后还想了一晚上. 题解中&qu ...

  3. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  4. [UOJ#245][UER#7]天路(近似算法)

    允许5%的相对误差,意味着我们可以只输出$\log_{1.05} V$种取值并保证答案合法.并且注意到答案随着区间长度而单增,故取值不同的答案区间是$O(\log_{1.05} V)$的. 于是初始x ...

  5. 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph

    [UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...

  6. UOJ #142. 【UER #5】万圣节的南瓜灯 并查集

    #142. [UER #5]万圣节的南瓜灯 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/142 Descrip ...

  7. uoj #139. 【UER #4】被删除的黑白树 dfs序 贪心

    #139. [UER #4]被删除的黑白树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/139 Descript ...

  8. UOJ#454. 【UER #8】打雪仗

    UOJ#454. [UER #8]打雪仗 http://uoj.ac/problem/454 分析: 好玩的通信题~ 把序列分成三块,\(bob\)先发出这三块中询问点最多的一块给\(alice\). ...

  9. UOJ#210. 【UER #6】寻找罪犯 2-sat

    #210. [UER #6]寻找罪犯 链接:http://uoj.ac/problem/210 想法:2-sat模型.每个人拆点,分别表示为犯人.非犯人.每个句供词拆点,分别表示真话.假话.供词与对应 ...

随机推荐

  1. Realm Java的学习、应用、总结

    从React Native珠三角沙龙会议了解到Realm这个开源库,然后开始学习.理解和使用Realm.Realm是跨平台.支持多种主流语言,这里主要是对Realm Java结合实际项目的一些情况进行 ...

  2. Hadoop2.6.0伪分布环境搭建

    用到的软件: 一.安装jdk: 1.要安装的jdk,我把它拷在了共享文件夹里面.   (用优盘拷也可以) 2.我把jdk拷在了用户文件夹下面. (其他地方也可以,不过路径要相应改变) 3.执行复制安装 ...

  3. memcached安装配置

    简述: memcached,开源的分布式缓存数据系统.高性能的NOSQL . Linux 一.环境配置与安装 01.编译准备环境 yum install -y gcc make cmake autoc ...

  4. VS2013 无法在Web服务器上启动调试。IIS未列出与打开的URL匹配的网站。

    出现这个问题的原因是:没有用管理员权限运行VS2013. 本来遇到这个问题的时候,不知道什么原因.后来附加到进程调试的时候,提示要以管理员身份运行.才知道啥原因.

  5. if -else 条件语句原理

    #!/usr/bin/python # coding utf-8 name = '?' if name == 'python': print('欢迎BOSS') else: print('输入错误')

  6. C++折半插入排序

    代码如下: #include <iostream> using namespace std; void insertSort(int a[], int n) { for(int i=1;i ...

  7. iOS开发--QQ音乐练习,歌词的展示,歌词的滚动,歌词的颜色变化

    一.歌词的展示 -- 首先歌词是在scrollView上,scrollView的大小是两个屏幕的宽度 scrollView滚动修改透明度的代码                             ...

  8. iOS开发,系统自带的分享简单实现

    由于simulator设置里面没有新浪微博的选项,所以选择了真机调试,成功了.代码不多,包含头文件 没有配置登录信息的话,是没有作用的                                 ...

  9. 运维mysql基础

    1 mysql简介 一般写某个东西先介绍一下,我就老生常谈的简单介绍下(摘自维基百科) https://zh.wikipedia.org/wiki/MySQL MySQL(官方发音为英语发音:/maɪ ...

  10. Kernel Methods (4) Kernel SVM

    (本文假设你已经知道了hard margin SVM的基本知识.) 如果要为Kernel methods找一个最好搭档, 那肯定是SVM. SVM从90年代开始流行, 直至2012年被deep lea ...