#246. 【UER #7】套路

反攻正在进行中,按照套路,跳蚤国将会很快获得最终的胜利。跳蚤国的情报局也没闲下来,他们正打算派遣一批“菲克蚤”前往跳晚国窃取有关三星 note7的资料。
Fake Yang 是这批“菲克蚤”的教练,他教会他们各种 Fake的技术,以便更好混入敌方内部。共 n只菲克蚤,由 1到 n编号。Fake Yang给每个菲克蚤都算了特征值 a1,…,an,两个菲克蚤的相似度定义成这两个菲克蚤的特征值的差的绝对值,即第 i只菲克蚤与第 j只菲克蚤的相似度为∣ai−aj∣。
现在这批菲克蚤排成一列在 Fake Yang 面前,Fake Yang 需要在其中选出一些菲克蚤合成一个行动小队。按照套路,他会选取连续一整段的菲克蚤 al,al+1,…,ar。很显然,这个行动小队越大越好,但是按照套路,小队内的跳蚤最好都各不相同,假如有两只跳蚤长得很像的话很可能会引起跳晚们的怀疑。为此 Fake Yang 将小队的相似度定义为小队中的跳蚤两两之间的最小的相似度,用 s(l,r) 表示。
为保证安全,现在他想选取至少 k只跳蚤,且使得安全值最大。其中安全值定义如下:s(l,r)×(r−l)
但是,他并不知道最优解是什么,于是按照套路你需要帮助他求得这个值。
输入格式
按照套路,第一行三个正整数 n,m,k。k 的意义如前所述,n表示跳蚤的只数。
接下来一行 n个整数,按照套路依次表示 n只跳蚤的特征值 a1,…,an,保证 1≤ai≤m。
输出格式
按照套路,一行一个整数,表示答案。
input
10 10 2
1 4 2 6 1 9 6 8 10 3
output
8
explanation
一种方案是选取区间 [5,6],相似度为 8,答案为8×(6−5)=8。
限制与约定
由于一些原因,本题我们需要按照套路使用捆绑测试。每个子任务有若干个测试点,分为 5个子任务,你只有通过一个子任务的所有测试点才能按照套路得到这个子任务的分数。
子任务 分值 n的规模 m的规模
1 7 n≤100 m≤50000
2 13 n≤5000
3 20 n≤50000 m≤1000
4 30 m≤50000
5 30 n≤200000 m≤200000
在所有数据中,满足 2≤n≤200000,1≤m≤200000,2≤k≤n。
时间限制:2s
空间限制:256MB

题解:

算法一:dp

f[i][j]= abs(a[i]-a[j]) i+1=j

min(abs(a[i]-a[j]),min(f[i][j-1],f[i+1][j])) j-i>1

f[i][j]表示的是区间[i,j]的最小差值。但是数据范围很大所以我们要考虑减去一维或者滚动数组,因为当前状态i需要用到i+1的状态,所以我们倒着推。每次让当前的覆盖上一次的,上式中f[i][j]需要用到f[i+1][j]的结果现在的话直接继承。然后f[i]=min(f[i],f[i-1]),注意转换成一维后f[i]表示的是终点在i的区间。

算法二:如果一个区间的长度是x,那么最小差值一定不超过m/(x-1)

那么我们设一个常数s=sqrt(n)

当x<s时,用算法一中的算法求解。

当x>=s时,那么最小差不会超过 m/(s-1)

我们枚举差值|z-x|<=m/(s-1) ,然后找到权值z最近一次出现的位置,然后计算答案。但是这样还是不够,我们必须保证两个位置之间不存在再小的差值。所以我们还需要一个数组g[i]来记录差值i最近一次出现的位置,那么g[i]+1一定是在差值i+1或者更大的范围内,所以用(posx-g[i]-1)*(i+1)来更新答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 200003
#define LL long long
using namespace std;
LL f[N],ans,val[N];
int pos[N],n,m,k,g[N];
int main()
{freopen("a.in","r",stdin);//freopen("my.out","w",stdout);scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=n;i++) scanf("%I64d\n",&val[i]);int s=floor(sqrt(n));memset(f,127,sizeof(f));for (int i=n;i>=1;i--){for (int j=i+1;j<=min(n,i+s-1);j++){f[j]=min(f[j],f[j-1]);f[j]=min(f[j],abs(val[i]-val[j]));if (j-i+1>=k) ans=max(ans,(LL)(j-i)*f[j]);}}for (int i=1;i<=n;i++){int t=m/s;for (int j=0;j<=t+1;j++){LL y1=val[i]+j; LL y=val[i]-j;if (j>=1) g[j]=max(g[j-1],g[j]);if (y>=1) g[j]=max(g[j],pos[y]);if (y1<=m) g[j]=max(g[j],pos[y1]);if (i-g[j]+1>max(s,k))  ans=max(ans,(LL)(i-g[j]-1)*(LL)(j+1));}pos[val[i]]=i;}printf("%I64d\n",ans);
}

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】套路(dp+分块?分类讨论?)

    题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...

  3. uoj #246. 【UER #7】套路

    前言 找了个时间做了个一直想做的题 感觉还是很妙哒 题解 我们考虑一个做法 设序列长度为S 首先,如果暴力扫的话,是可以O(ns)O(ns)算出来所有长度为S的最优值的 但是S大的话,就不好办了 然后 ...

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

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

  5. [UOJ#245][UER#7B]天路

    Description 给出n个数,对于每个k(2<=k<=n),求出最大的一个ans,使得存在一个连续的长度为k的区间中最大值和最小值的差为ans. 答案与标准答案的误差不超过5%即为正 ...

  6. [UOJ#454][UER#8]打雪仗

    xx 转载于:https://www.cnblogs.com/lxzl/p/10324980.html

  7. 【UOJ】UER#3.B 开学前的日历

    将条件转化为i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j\geqslant 0,i+j\geqslant k|A_{v+i,u ...

  8. UOJ超级详细部署文档

    UOJ 部署 首先执行 sudo su 进入 root 然后执行 curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docke ...

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

    传送门http://uoj.ac/problem/246 题解很详细 第二部分的单调队列需要好好思考 #include<stdio.h> #include<cstring> # ...

最新文章

  1. 浏览器加载、解析、渲染的过程
  2. 这次真的是下定决心了
  3. robots协议是什么?对网站SEO有什么好处?
  4. 关于Javaweb部署到linux服务器产生乱码?的原因分析
  5. Java enum(枚举)的用法详解(转)
  6. 用Openswan组建Linux IPSec ---第二部分
  7. linux网络客户端命令
  8. 20170908在线编程之圆周上问两点间的距离问题
  9. 集成电路模拟版图入门-版图基础学习笔记(一)
  10. 中国石油大学《输气管道设计与管理(含课程设计)》第三阶段在线作业
  11. easyui 行编辑中上传附件
  12. python怎么读取xls文件
  13. [usOJ5529]小奇探险
  14. 稻城亚丁神州租车自驾游,一生一定要去一次的地方
  15. webrtc服务器开发--搭建环境
  16. 雷达原理习题【西电】
  17. 计算机科学与技术班徽图片,智慧教室平台教学系统在中职计算机专业教学中的应用...
  18. AMD Xilinx官网由于合规性不通过导致无法下载软件原因及解决办法
  19. php html 锚点,html中怎么设置锚点定位?设置锚点定位方法汇总
  20. 树莓派学习二 树莓派直接连接笔记本电脑方法(win10家庭版)

热门文章

  1. linux skyeye,在Ubuntu 10.04上安装SkyEye及测试
  2. .Bear勒索病毒如何删除它 .Bear后缀文件如何恢复(Dharma家族)
  3. 装修店铺营销活动策划?
  4. 数据架构——数据架构
  5. Python读取两个txt文件内容,重新写到新的txt文件
  6. 1024_scsdn_徽章获取日_日常工作记录_百度图片爬取小程序
  7. Windows 10打开蓝牙已关闭解决方法
  8. VIM 参考手册 For Vim version 7.3
  9. 发送手机短信验证码-后端、前端(验证码倒计时)
  10. Android Support Library介绍