#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. python datetime计算时间差_Python中关于日期的计算总结
  2. Zabbix监控环境的搭建
  3. CNN卷积层图像和矩阵转换函数
  4. QByteArray怎么转化为QString类型,并且在QLineEdit上面显示出来
  5. 中文分词中的战斗机-jieba库
  6. java定义整形输出_java程序命令行接受字符转换为整形并相加输出
  7. 运用基础班知识做一个网页
  8. laravel auth::check 后session失败_01.laravel简介
  9. linux java new date_Linux java Tomcat 项目中 new Date 获取时间 8小时 时差
  10. Django搭建个人博客:改写View视图
  11. devtmpfs文件系统创建设备节点
  12. 怎样安装linux中文字体,linux如何安装中文字体库
  13. beanshell字符串替换_Beanshell语法
  14. 2018主流台式计算机跑分,pu天梯图2018最新版2018电脑cpu处理器性能排行榜
  15. win10 进不了修复服务器失败怎么办,win10自动修复失败开不了机怎么办?win10自动修复失败无限循环解决方法大全...
  16. 【discuzx2】【家园广播】follow_feed.htm
  17. 邮件客户端远程管理邮箱
  18. 唯快不破:redis源码剖析04-sds动态字符串
  19. 各种笔记本、台式和主板品牌,进入BIOS设置的方法大全
  20. pfx格式密钥库修改密码

热门文章

  1. ARCGIS水文分析:水库容量和蓄水区计算
  2. 如何用【测试思维】做“支付功能”测试?
  3. linux Centos的ftp搭建-配置-上传下载文件--全面版
  4. 到底多大并发才算高并发?一文带你全面认识高并发!
  5. 如果有一天我老无所依,请把我埋在,新疆的田野上
  6. 百度地图 web 开发 BMap.point格式
  7. laravel中guard是什么
  8. py2exe 打包 Pmw Error 3 解决方案
  9. 视频产生的本质及色彩空间:RGB 和 YUV
  10. 自定义/修改微信二维码样式