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;怎么办呢&…

vscode 支持 markdown 流程图

1、安装插件Markdown Preview Enhanced 2、熟悉语法&#xff1a; st>start: 开始 e>end: 结束 op1>operation: 新品开发流程 op2>operation: 产品需求提出 op3>operation: 产品试用 负责人&#xff1a;吴xx op4>operation: 包装 op5>parallel: 继续讨论 …

【OpenCV】imread读取数据为空

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

影响 oracle 性能的常见事件

影响oracle 性能的常见事件&#xff0c;比其他任何事件都能使速度减慢的事件&#xff1a; db file scattered read&#xff1a;该事件通常与全表扫描有关。因为全表扫描是被放入内存中进行的进行的&#xff0c; 通常情况下它不可能被放入连续的缓冲区中&#xff…

android 程序崩溃日记捕捉

1、重新UncaughtExceptionHandler public class CrashHandler implements Thread.UncaughtExceptionHandler {public static final String TAG "CrashHandler";//系统默认的UncaughtException处理类private Thread.UncaughtExceptionHandler mDefaultHandler;//Cra…

车型数据库设计 mongodb

直接上代码了 const mongoose require(mongoose); const Schema mongoose.Schema;// 汽车索引列表 const CarListSchema new mongoose.Schema({// 首字母 A、B、C...initial: String,// 汽车品牌分类category: [{// 首字母initial: String,// 拼音pinyin: Array,// 汽车大品…

洛谷 P3102 [USACO14FEB]秘密代码Secret Code

P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his cows; the message is a string of length at least 2 containing only the characters A..Z. To encrypt his message, FJ applies a sequence of "oper…

iview tag 标签点击事件

iview的tag组件有一个地方比较奇怪&#xff0c;就是默认只有on-close事件。 当我们想点击关闭和激活tag组件的时候&#xff0c;我们只能自己进行维护。 需要只用click.native进行控制 <Tag color"red" :checkable"true" :checked"false" clic…

android 获取url中的参数,验证邮箱格式,截取字符串中键值对的值,String的字节长度,去空格,替换字符

String ss"hello"; byte[] buffss.getBytes(); int fbuff.length; System.out.println(f); 字节长度。一个中文是3。其他是1 1、获取url中的参数 创建string String urls "http://www.yxtribe.com/yuanxinbuluo/weixin/getJsp?urlwechatweb/business-style-f…

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、微…

QC安装与运行中的问题汇集

服务器localhost127.0.0.1一、QC安装成功&#xff0c;但服务无法启动QC在安装过程中最容易出问题的就是SQL和jbossSQL ,JBOSS, QC三个启动都是独立的。托盘qc启动成功并不表示成功启动jboss,不加qcbin试试看&#xff0c;能确认jboss是否启动成功。如果JBOSS启动失败往往有以下几…

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…

CodeForces 580A Kefa and First Steps

Time limit 2000 ms Memory limit 262144 kB Kefa decided to make some money doing business on the Internet for exactly n days. He knows that on the i-th day (1 ≤ i ≤ n) he makes ai money. Kefa loves progress, thats why he wants to know the length of…