uoj#246. 【UER #7】套路(dp+分块?分类讨论?)

题目链接

分析:
目前为止我只能理解dp部分

我就喜欢这种单纯不做作的题目
一看名字就明白了这道题的本质

中二的题目描述

很显然,我们的关键就是求出最小相似度
朴素算法n^4

如果我们现在有一个权值数组
显然,每一个数只可能与最邻近ta的数产生贡献
假设我们要求[i,j]之间的最小差距
那我们可以分成两部分[i,k],[k+1,j]
枚举k,取最小就可以了

但是这样的复杂度是n^3

然而我们全然不用枚举这个k

f[i][j]=abs(a[i]-a[j]) //i+1==j
f[i][j]=min{f[i+1][j],f[i][j-1],abs(a[i]-a[j])} //j-i>1

那还是n^2的,我们考虑能不能再次优化,去掉一维
空间:i的转移只牵扯到i和i-1,所以可以滚动数组
更进一步,因为当前状态i需要用到i+1的状态,所以我们倒着推
每次让当前的覆盖上一次的,上式中f[i][j]需要用到f[i+1][j]的结果现在的话直接继承
这样我们就可以在空间上直接去掉一维

f[i]=min(f[i],f[i-1])

注意转换成一维后f[i]表示的是终点在i的区间
这里写图片描述

最终算法:
实际上的基于dp的分类讨论
如果一个区间的长度是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<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define ll long longusing namespace std;const int N=200002;
int n,m,k;
int pos[N],g[N];
ll f[N];
ll a[N],ans=0;ll abs(ll x){if (x>0) return x; else return -x;}int main()
{scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=n;i++) scanf("%lld",&a[i]);int s=floor(sqrt(n));memset(f,127,sizeof(f));   //INFfor (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(a[j]-a[i]));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 yy=a[i]+j;ll y=a[i]-j;if (j>=1) g[j]=max(g[j-1],g[j]);if (y>=1) g[j]=max(g[j],pos[y]);if (yy<=m) g[j]=max(g[j],pos[yy]);if (i-g[j]+1>max(s,k)) ans=max(ans,(ll)(i-g[j]-1)*(ll)(j+1));}pos[a[i]]=i;}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673197.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARCSDE的直接连接(SQLSERVER)

ARCSDE的直接连接&#xff08;SQLSERVER&#xff09; 环境&#xff1a;windows 2003 (64bit) \oralce10G \sqlserver 2000现在想把另外一个数据库迁移过来&#xff0c;同时也需要迁移SDE&#xff0c;但现在服务器上已经安装了SDE for sql server &#xff0c;怎么办呢&…

【OpenCV】imread读取数据为空

直接加配置好的props文件到新的工程时&#xff0c;会出现imread读出来的Mat为空的情形&#xff0c;搜了一下&#xff0c;发现是opencv的配置问题&#xff01;&#xff01;&#xff01; 是这样的&#xff0c;之前配置时为了省事儿&#xff0c;无论是Debug还是Release中的附加依赖…

oracle数据导入与导出

数据的导入导出 说明&#xff1a; 针对的对象&#xff1a; 数据的导入导出牵涉到的角色主要是工程实施人员。 需解决的问题&#xff1a;把所需要的数据从一个数据库中导入到另外一个数据库中。 1 工具方式 1.1 工具说明 1. 使用PLSQL Developer工具主要为了…

ubuntu中使用apt-get安装zbar

apt-get是linux中常用的shell命令&#xff0c;适用于deb包管理式的操作系统&#xff0c;主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。apt-get命令一般需要root权限执行&#xff0c;所以前边一般跟着sudo命令。 Zbar是一个开源的二维码&#xff08;…

微信红包 开发前的准备

今天的开发目标是实现微信红包功能。先记录需要进行微信红包开发前的准备工作。 1、进行微信支付&#xff1a;需要注册认证的服务号或者认证的企业号 2、若要进行红包开发&#xff0c;前置准备条件 入住时间超过90天&#xff1b;连续交易正常交易时间30天&#xff1b; 3、微…

android 屏幕横竖屏切换时生命周期运行详解,创建横屏layout,has no declaration in the base

横屏代码 1、配置文件设置 android:screenOrientation"landscape" 2、java代码设置 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//hp 竖屏代码 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//sp activit…

微信支付 商户Key 支付Key API密钥 的获取

读了微信支付的开发文档&#xff0c;感觉是不同阶段&#xff0c;不同的同学写的&#xff0c;有些专业名词比较混乱&#xff0c;甚至还会有错别字&#xff0c;以及接口更新了&#xff0c;而文档不更新的情况。 使用微信支付&#xff0c;必须要用到 api密钥进行签名 其中 &…

微信支付 签名算法 sign node实现

开发微信支付过程中&#xff0c;第一道门槛就是微信支付接口签名&#xff0c;只要按照官方文档写&#xff0c;就不会有什么错。 1、官方签名文档地址 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter4_3 2、我的实现 // 获取微信签名 getSign: (para…

使用WINPE在硬盘安装WIN7系统

使用WINPE在硬盘安装WIN7系统 看到此标题&#xff0c;可能好多朋友会说&#xff0c;安装个WIN7操作系统&#xff0c;使用安装盘直接安装就是了&#xff0c;有必要做个文章介绍吗&#xff1f;的确&#xff0c;安装操作系统&#xff0c;最方便最简单的方法&#xff0c;就是使用系…

微信开发基础 获取用户OpenID 列表

1、官方文档 https://mp.weixin.qq.com/wiki?tresource/res_main&idmp1421140840 2、我使用的请求库是superagent&#xff0c;核心代码如下 /*** 获取公众号用户OpenID列表* param {*} request * param {*} h */ userOpenIdList: async function (request, h) {const ac…

QC与WIN7、IE8 兼容问题解决方案

QC与win7不兼容 1、 通过开始菜单搜索框&#xff0c;输入UAC&#xff0c;会出现“更改用户帐户控制设置”&#xff08;ChangeUser Account Control菜单 项。点击打开后&#xff0c;通过滚动条选择“从不通知”。 2、 打开cmd命令行&#xff0c;运行如下命令&#xff1a;bcd…

微信开发 根据openid 获取用户基本信息

1、官方文档 https://mp.weixin.qq.com/wiki?tresource/res_main&idmp1421140839 2、我的核心代码 /*** 根据openid获取用户详情* param {*} request * param {*} h */ userInfoByOpenId: async function (request, h) {const { openid } request.params;const access_…