2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题——小明序列 
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) 
Problem Description 
  大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了。可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找去都是自己早已研究过的序列。小明想既然找不到,那就自己来发明一个新的序列问题吧!小明想啊想,终于想出了一个新的序列问题,他欣喜若狂,因为是自己想出来的,于是将其新序列问题命名为“小明序列”。 
  提起小明序列,他给出的定义是这样的: 
  1.首先定义S为一个有序序列,S={ A1 , A2 , A3 , … , An },n为元素个数 ; 
  2.然后定义Sub为S中取出的一个子序列,Sub={ Ai1 , Ai2 , Ai3 , … , Aim },m为元素个数 ; 
  3.其中Sub满足 : 
  Ai1<Ai2<Ai3<...<Aij−1<Aij<Aij+1<...<Aim" role="presentation" style="position: relative;">Ai1<Ai2<Ai3<...<Aij−1<Aij<Aij+1<...<AimAi1<Ai2<Ai3<...<Aij−1<Aij<Aij+1<...<Aim; 
  4.同时Sub满足对于任意相连的两个Aij-1与Aij都有 ij - ij-1 > d (1 < j <= m, d为给定的整数); 
  5.显然满足这样的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:  6297 6296 6295 6294 6293
应该是一道线段树优化dp" role="presentation" style="position: relative;">dpdp的入门题吧,题目要让我们求的是数列中间距不小于d" role="presentation" style="position: relative;">dd的最长上升子序列。那直接权值线段树叶节点[l,l]" role="presentation" style="position: relative;">[l,l][l,l]存储以权值l" role="presentation" style="position: relative;">ll结尾的最长的上升子序列的长度,然后边查询边插入即可。
代码如下:
#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 100005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return ans;
}
int n,d,a,b,ans,f[N],x[N],siz=0;
struct Node{int l,r,maxn;}T[N<<2];
inline void pushup(int p){T[p].maxn=max(T[lc].maxn,T[rc].maxn);}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r;
    if(l==r)return;
    build(lc,l,mid),build(rc,mid+1,r);
}
inline void update(int p,int k,int v){
    if(T[p].l==T[p].r){
        T[p].maxn=max(T[p].maxn,v);
        return;
    }
    if(k<=mid)update(lc,k,v);
    else update(rc,k,v);
    pushup(p);
}
inline int query(int p,int ql,int qr){
    if(ql<=T[p].l&&T[p].r<=qr)return T[p].maxn;
    if(qr<=mid)return query(lc,ql,qr);
    if(ql>mid)return query(rc,ql,qr);
    return max(query(lc,ql,mid),query(rc,mid+1,qr));
}
int main(){
    while(~scanf("%d%d",&n,&d)){
        memset(T,0,sizeof(T)),ans=0,siz=0;
        for(int i=1;i<=n;++i)x[i]=read(),siz=max(siz,x[i]);
        build(1,0,siz);
        for(int i=1;i<=n;++i){
            if(i-d-1>=1)update(1,x[i-d-1],f[i-d-1]);
            if(x[i]>=1)f[i]=query(1,0,x[i]-1)+1;
            else f[i]=1;
            ans=max(ans,f[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)的更多相关文章
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
		题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ... 
- 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)
		传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ... 
- hdu----(4521)小明系列问题——小明序列
		小明系列问题——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ... 
- 小明系列问题――小明序列(LIS)
		小明系列问题――小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ... 
- 小明系列问题——小明序列(Lis  相距大于d的单调上升子序列)
		小明系列问题——小明序列 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或扩展成经典的LIS)
		小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ... 
- 2018.07.08 hdu6183 Color it(线段树)
		Color it Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Proble ... 
- 2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP)
		2021.12.08 P1848 [USACO12OPEN]Bookshelf G(线段树优化DP) https://www.luogu.com.cn/problem/P1848 题意: 当农夫约翰闲 ... 
随机推荐
- 队列queue实例(生产者和消费者模型)
			import queue, threading, time q = queue.Queue(maxsize=10)def producter(n): count = 1 while True: q.p ... 
- 4 并发编程-(进程)-守护进程&互斥锁
			一.守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束 ... 
- C#--反射技术
			反射:反射为了动态(比如动态的加载dll,动态创建类型.动态调用方法等) 引用 using System.Reflection 原理: 一个类库编译后会生成一个以.dll结尾的文件,一个以.pdb结尾 ... 
- const对象,指向const对象的指针 和  const 指针
			const对象: const对象声明时必须赋初值,该值在编译阶段确定,不可在程序中修改. const修饰符既可放在类型名前也可放在类型名后,通常放在类型名前.不过放在类型名后易于理解. const i ... 
- 认识serviceLoader
			最近在研究系统设计方面的东西,发现有很多通用的解决方案,包括spring配置扩展以及serviceLoader的应用,这里简单记录下serviceLoader的简单应用,网上例子很多,大同小异,本人觉 ... 
- 安装oracle后java -version命令显示 jdk version "1.3.1"的原因
			因为先装的JDK,后装了oracle,oracle的JDK配置把原来的jdk路径替换掉了. 我的电脑->属性->高级->环境变量->系统变量->PATH ,把JDK的路径 ... 
- CAD2010安装说明
			1. 2. 3. 4. 5. . 提供算号服务(也就是付费才能获得的注册码)... 不会的可以问的撒.... 
- IsPostBack用法
			可以自己定义 在页面中定义隐藏的input,设置为ispostback. <form action="" method=""> <input ... 
- android笔记:ListView及ArrayAdapter
			ListView用于展示大量数据,而数据无法直接传递给ListView,需要借助适配器adapter来完成. ArrayAdapter是最常用的adapter,可以通过泛型来指定要适配的数据类型.常见 ... 
- 120. Triangle(Array; DP)
			Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ... 
