hdu 4521 小明序列(线段树,DP思想)
题意:
①首先定义S为一个有序序列,S={ A1 , A2 , A3 , ... , An },n为元素个数 ;
②然后定义Sub为S中取出的一个子序列,Sub={ Ai1 , Ai2 , Ai3 , ... , Aim },m为元素个数 ;
③其中Sub满足 Ai1 < Ai2 < Ai3 < ... < Aij-1 < Aij < Aij+1 < ... < Aim ;
④同时Sub满足对于任意相连的两个Aij-1与Aij都有 ij - ij-1 > d (1 < j <= m, d为给定的整数);
⑤显然满足这样的Sub子序列会有许许多多,而在取出的这些子序列Sub中,元素个数最多的称为“小明序列”(即m最大的一个Sub子序列)。
例如:序列S={2,1,3,4} ,其中d=1;
可得“小明序列”的m=2。即Sub={2,3}或者{2,4}或者{1,4}都是“小明序列”。
当小明发明了“小明序列”那一刻,情绪非常激动,以至于头脑凌乱,于是他想请你来帮他算算在给定的S序列以及整数d的情况下,“小明序列”中的元素需要多少个呢?
思路:
DP的思想,但是只能想到N^2的算法。嘿嘿正好题目有说(0<=Ai<=10^5),那就是了,用线段树保存最值。
每次做题都要考虑周全,边界什么的,,
d=0时单独用贪心的方法算,其实不用也可以,。
代码:
int const N = 100005; int a[N], f[N];
int F[N<<2];
int n,d; void PushUp(int rt){
F[rt]=max( F[rt<<1],F[rt<<1|1] );
return;
} void build(int l,int r,int rt){
if(l==r){
F[rt]=0;
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
PushUp(rt);
} void update(int pos,int x,int l,int r,int rt){
if(l==r){
F[rt]=max( F[rt],x );
return;
}
int m=(l+r)>>1;
if(pos<=m)
update(pos,x,lson);
else
update(pos,x,rson);
PushUp(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && r<=R){
return F[rt];
}
int m=(l+r)>>1;
int res=0;
if(L<=m)
res=max( res,query(L,R,lson) );
if(m<R)
res=max( res,query(L,R,rson) );
return res;
} int proc1(){
int d[N];
int cn=0;
d[0]=-1; rep(i,1,n){
if(a[i]>d[cn]){
d[++cn]=a[i];
}else{
int pos=lower_bound(d+1,d+1+cn,a[i])-d;
d[pos]=a[i];
}
}
return cn;
} int main(){ while(scanf("%d%d",&n,&d)!=EOF){ int es=-inf; rep(i,1,n){
scanf("%d",&a[i]);
es=max( es,a[i] );
} if(d==0){
int ans=proc1();
printf("%d\n",ans);
}else{
build(0,es,1);
int ans=1; rep(i,1,n){
if(i-d-1<=0){
f[i]=1;
}else{
update(a[i-d-1],f[i-d-1],0,es,1); //pos,x,l,r,rt
if(a[i]==0){
f[i]=1;
continue;
}
int t=query(0,a[i]-1,0,es,1); //L,R,l,r,rt
f[i]=t+1;
ans=max( ans,f[i] );
}
}
printf("%d\n",ans);
}
} return 0;
}
hdu 4521 小明序列(线段树,DP思想)的更多相关文章
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 4521 小明系列问题——小明序列 线段树+二分
小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Pro ...
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
- hdu 4521 小明系列问题——小明序列 线段树
题意: 给你一个长度为n的序列v,你需要输出最长上升子序列,且要保证你选的两个相邻元素之间在原数组中的位置之差大于d 题解: 这个就是原来求最长上升子序列的加强版,这个思路和最长上升子序列的差不多 ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 4521 小明系列问题——小明序列 (线段树 单点更新)
题目连接 Problem Description 大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了.可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来 ...
- hdu 4521 小明系列问题——小明序列(线段树 or DP)
题目链接:hdu 4521 本是 dp 的变形,却能用线段树,感觉好强大. 由于 n 有 10^5,用普通的 dp,算法时间复杂度为 O(n2),肯定会超时.所以用线段树进行优化.线段树维护的是区间内 ...
- 【Foreign】划分序列 [线段树][DP]
划分序列 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 9 4 ...
- HDU 4719Oh My Holy FFF 线段树+DP
/* ** 日期: 2013-9-12 ** 题目大意:有n个数,划分为多个部分,假设M份,每份不能多于L个.每个数有一个h[i], ** 每份最右边的那个数要大于前一份最右边的那个数.设每份最右边的 ...
随机推荐
- Java定时任务Quartz
第一步:pom文件中添加依赖包 第二步:创建xml文件,名称为:spring-scheduler 路径如下图: 第三步:spring-scheduler配置详情 <!--创建任务--> & ...
- Java基础系列(37)- 数组下标越界及小结
数组的四个基本特点 其长度是确定的,数组一旦被创建,它的大小就是不可以改变的 其元素必须是相同类型,不允许出现混合类型 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组变量属于引用类型,数 ...
- windows10 安装配置 jmeter 自动化接口测试 邮件报告
1.安装依赖包:JDK(版本:jdk-7u17-windows-x64) 双击即可安装,注意:jdk不要安装中文路径下,jdk和jre安装在同一路径下 1.1:配置jdk环境变量 (1)JAVA_HO ...
- YbtOJ#791-子集最值【三维偏序】
正题 题目链接:http://www.ybtoj.com.cn/contest/123/problem/1 题目大意 给出\(3\)个长度为\(n\)的排列\(A,B,C\).然后一个下标集合\(S\ ...
- 项目配置shiro原缓存注解失效
项目用springboot + shiro + ehcache @cacheable 注解不起作用原因 Shiro框架初始化比Spring框架的某些部件早,导致使用@Autowire注入Shiro框架 ...
- Python代码阅读(第8篇):列表元素逻辑判断
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
- 让前端的下拉框支持单选、多选及全选,后台MyBaits解决方案
目录 一.解决思路 二.请求参数 三.后台相关代码 四.Mybatis注意要点 一.解决思路 让前端的下拉框支持单选.多选及全选,后台让Mybatis使用** trim **标签拼接动态SQL,实 ...
- 为什么 Dapr 如此令人兴奋
如今你构建软件,您可以从数量众多的云服务中进行选择.仅 AWS 就每个月都在不断为其200多项服务添加新服务,而其他云提供商也都在跟上. 如果您的公司想与您的竞争对手竞争,您就需要充分利用这些服务,这 ...
- 当一个 Pod 被调度时,Kubernetes 内部发生了什么?
在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 上,然后对应 Node 上的 Kubelet 才能够运行这些 Pod . kube-scheduler 是集群控制平面的主要组 ...