链接:

huangjing

题目:中文题目

思路:

1:这个题目假设去掉那个距离大于d的条件,那么必定是一个普通的LIS。可是加上那个条件后就变得复杂了。我用的线段树的解法。

。就是採用延迟更新的做法。用为距离要大于d啊,所以我们在循环到第i的时候,就对(i-d-1)这个点进行更新。由于假设在(i-d-1)这个点更新了,会对后面的造成影响。然后线段树的tree【】数组存的是以i结尾的最长lis,那么每次询问的时候就找最大的tree【】就能够了。。。

2:dp的做法事实上跟线段树的思想一样,就是在对i进行询问的时候对i-p-1进行更新操作,这样就保证了增加g里面的书是间隔大于d的,那么就非常easy了。

代码:

小明系列问题——小明序列

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1862    Accepted Submission(s): 569

Problem Description
大家都知道小明最喜欢研究跟序列有关的问题了,但是也就由于这样,小明差点儿已经玩遍各种序列问题了。

可怜的小明苦苦地在各大站点上寻找着新的序列问题,但是找来找去都是自己早已研究过的序列。

小明想既然找不到,那就自己来发明一个新的序列问题吧!

小明想啊想,最终想出了一个新的序列问题,他欣喜若狂,由于是自己想出来的。于是将其新序列问题命名为“小明序列”。

  提起小明序列,他给出的定义是这种:
  ①首先定义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的情况下,“小明序列”中的元素须要多少个呢?

Input
输入数据多组。处理到文件结束;
  输入的第一行为两个正整数 n 和 d。(1<=n<=10^5 , 0<=d<=10^5)
  输入的第二行为n个整数A1 , A2 , A3 , ... , An,表示S序列的n个元素。(0<=Ai<=10^5)
Output
请对每组数据输出“小明序列”中的元素须要多少个,每组測试数据输出一行。
Sample Input
2 0 1 2 5 1 3 4 5 1 2 5 2 3 4 5 1 2
Sample Output
2 2 1
Source
2013腾讯编程马拉松初赛第四场(3月24日)
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5081 5080 5079 5078 5077 

代码:

1:线段树做法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#define eps 1e-9
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;const int maxn=100000+10;int a[maxn],dp[maxn],n,d;//表示以i结尾的LIS
int tree[maxn<<2];void push_up(int dex)
{tree[dex]=max(tree[dex<<1],tree[dex<<1|1]);
}void buildtree(int l,int r,int dex)
{tree[dex]=0;if(l==r)  return;int mid=(l+r)>>1;buildtree(l,mid,dex<<1);buildtree(mid+1,r,dex<<1|1);
}void Update(int pos,int l,int r,int dex,int value)
{if(l==r){tree[dex]=max(tree[dex],value);return;}int mid=(l+r)>>1;if(pos<=mid) Update(pos,l,mid,dex<<1,value);else Update(pos,mid+1,r,dex<<1|1,value);push_up(dex);
}int Query(int l,int r,int L,int R,int dex)
{if(L<=l&&R>=r)  return tree[dex];int mid=(l+r)>>1;if(R<=mid)  return Query(l,mid,L,R,dex<<1);else if(L>mid)  return Query(mid+1,r,L,R,dex<<1|1);else return max(Query(l,mid,L,R,dex<<1),Query(mid+1,r,L,R,dex<<1|1));
}int main()
{int temp,ans;while(~scanf("%d%d",&n,&d)){ans=temp=-1;memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){scanf("%d",&a[i]);temp=max(temp,a[i]);}buildtree(0,temp,1);for(int i=1;i<=n;i++){if(i-d-1>=1)  Update(a[i-d-1],0,temp,1,dp[i-d-1]);if(a[i]>=1)  dp[i]=Query(0,temp,0,a[i]-1,1)+1;else  dp[i]=1;ans=max(ans,dp[i]);}printf("%d\n",ans);}return 0;
}

2:dp做法

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;const int maxn=100000+10;int a[maxn],dp[maxn],g[maxn],n,p;int main()
{while(~scanf("%d%d",&n,&p)){int ans=-1;memset(dp,0,sizeof(dp));memset(g,INF,sizeof(g));for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++){if(i-p-1>0)  g[dp[i-p-1]]=min(a[i-p-1],g[dp[i-p-1]]);dp[i]=lower_bound(g+1,g+1+n,a[i])-g;ans=max(ans,dp[i]);}cout<<ans<<endl;}return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

hdu4521 小明系列的问题——小明序列(LIS变种 (段树+单点更新解决方案))相关推荐

  1. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

  2. 【微信小程序系列】微信小程序连接后端数据库(SSM)案例

    [微信小程序系列]微信小程序连接后端数据库(SSM)案例 登录页面 login.wxml <view class="page"><loading hidden=& ...

  3. 【微信小程序系列】微信小程序简单的实现发送订阅信息

    [微信小程序系列]微信小程序简单的实现发送订阅信息 项目结构 两个云函数一个页面 获取模板 注:详细内容中的参数很重要,一会要在云函数里用 代码 app.js // app.js App({onLau ...

  4. 微信小程序系列之注册小程序

    微信公众号:Android疯子   微信小程序已经火了一段时间了,很惭愧自己现在才开始做这方面.作为一个Android开发者,从Java代码一下转到各种js.css,好像跨度还是挺大的,但是不要担心, ...

  5. esp32 linux内核,【小狂系列】跟着小狂玩ESP32之编译环境搭建篇

    本帖最后由 3guoyangyang7 于 2016-11-3 18:41 编辑 趁热要打铁,昨天发了ESP32的预告贴,今天小狂就带大家刷一刷ESP32的编译环境搭建.怎么说的,ESP32可以在多平 ...

  6. hdu 4501 小明系列故事——买年货 多重背包

    小明系列故事--买年货                                                                          Time Limit: 500 ...

  7. HDUOJ----4501小明系列故事——买年货(三维背包)

    小明系列故事--买年货 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tota ...

  8. HDU4506 小明系列故事——师兄帮帮忙

    问题链接:HDU4506 小明系列故事--师兄帮帮忙. 问题描述:参见上述链接. 问题分析:(略). 程序说明:函数powermod()是快速模幂函数. AC的C++语言程序如下: /* HDU450 ...

  9. 小明系列问题――小明序列(LIS)

    小明系列问题――小明序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

最新文章

  1. CentOS 7常用命令
  2. do while循环语句_流程控制之循环语句【while循环语句】
  3. Mips TLB miss异常
  4. 【图神经网络】万物皆可Graph | 当推荐系统遇上图神经网络
  5. thymeleaf片段使用_Thymeleaf –片段和angularjs路由器局部视图
  6. 转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生
  7. HDU 5410 CRB and His Birthday ——(完全背包变形)
  8. 从行业应用到智慧城市,升哲科技Alpha协议如何保障物理世界的数据传输
  9. 蓝桥杯 历届试题 带分数
  10. leetcode 只出现一次的数字
  11. (14)css—伪类选择器
  12. 使用jad反编译Java文件
  13. 考上985的研究生了!
  14. matlab符号函数绘图法_MATLAB符号运算实验
  15. 为civil3D2018 添加snoop DB工具
  16. java获取一天的开始时间和结束时间
  17. 论软件自动化测试中 QR_Code 的登录的逻辑
  18. AMESim2020.1仿真编译失败解决方法之一
  19. RecyclerView 梳理:点击amp;长按事件、分割线、拖曳排序、滑动删除
  20. ubuntu控制台访问u盘_ubuntu中查看u盘的方法

热门文章

  1. html5游戏制作总结
  2. hibernate联合主键 注解方式
  3. [原创]关于设置linux中vim 显示行号
  4. 安卓教程:提取APK程序里图片资源的方法
  5. HTTP协议编程,实现文件上传,Android客户端代码
  6. SQL Server 2005中的SQLCMD工具使用
  7. Python学习笔记之列表(三)
  8. 【SpringCloud从0到6】 第二节:注册中心 - eureka
  9. 文件分片_怎样屏蔽QQ和微信外发文件,同时允许发送截图
  10. linux11g导入10g 怎么改版本,Oracle 11g导入到10g引起的错误