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

大家都知道小明最喜欢研究跟序列有关的问题了,可是也就因为这样,小明几乎已经玩遍各种序列问题了。可怜的小明苦苦地在各大网站上寻找着新的序列问题,可是找来找去都是自己早已研究过的序列。小明想既然找不到,那就自己来发明一个新的序列问题吧!小明想啊想,终于想出了一个新的序列问题,他欣喜若狂,因为是自己想出来的,于是将其新序列问题命名为“小明序列”。

  提起小明序列,他给出的定义是这样的:
  ①首先定义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

老题。维护区间最值。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new HDU4521().solve();}
}class HDU4521 {InputReader in = new InputReader(System.in);PrintWriter out = new PrintWriter(System.out);final int N  = 100000 ;SegmentTree tree = new SegmentTree() ;int[] seq = new int[N+8] ;int[] dp = new int[N+8] ;void solve() {int n , d ; while(in.hasNext()){n = in.nextInt() ;d = in.nextInt() ;for(int i = 1 ; i <= n ; i++) seq[i] = in.nextInt() ;tree.build() ;int res = 1 ;for(int i = 1 ; i <= d+1 ; i++) dp[i] = 1 ;for(int i = d+2 ; i <= n ; i++){tree.update(seq[i-d-1] , dp[i-d-1] , 1 , 0 , N)  ;dp[i] = tree.query(0 , seq[i]-1 , 1 , 0 , N) + 1 ;res = Math.max(res , dp[i]) ;}out.println(res) ;}out.flush() ;}
}class SegmentTree{final int N = 100008 ;int[] max = new int[N<<2] ;void build(){Arrays.fill(max ,  0) ;}void update(int pos , int val , int root , int l , int r){if(l == r){max[root] = Math.max(max[root] , val) ;return ; }int m = (l + r) >> 1 ;if(pos <= m) update(pos, val, root<<1 , l , m) ;else update(pos, val, root<<1|1 , m+1 , r) ;max[root] = Math.max(max[root<<1] , max[root<<1|1]) ;}int query(int L , int R , int root , int l , int r){if(L > R) return 0 ;if(L <= l && r <= R) return max[root] ;int m = (l + r) >> 1 ;int res = 0 ;if(L <= m) res = Math.max(res , query(L, R, root<<1, l, m)) ;if(R > m) res = Math.max(res , query(L, R, root<<1|1, m+1 , r)) ;return res ;}
}class InputReader {public BufferedReader reader;public StringTokenizer tokenizer;public InputReader(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = new StringTokenizer("") ;}private void eat(String s){tokenizer = new StringTokenizer(s) ;}public String nextLine(){try {return reader.readLine() ;} catch (Exception e) {return null ;}}public boolean hasNext(){while(!tokenizer.hasMoreTokens()){String s = nextLine() ;if(s == null) return false ;eat(s) ;}return true ;}public String next() {hasNext() ;return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}

HDU4521线段树相关推荐

  1. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  2. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  5. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  6. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  7. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  8. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  9. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

最新文章

  1. [深入浅出Cocoa]详解键值观察(KVO)及其实现机理
  2. Android更新Ui的几种方法
  3. 一种关于感受野尺寸计算的思路
  4. 虹口区巡检机器人_上海巡检机器人
  5. 使用Prometheus+Grafana 监控MySQL/MONGODB
  6. 第七十五期:Java 2019 生态圈使用报告,这结果你赞同吗?
  7. 区块链安全-以太坊智能合约静态分析
  8. 使用Newtonsoft.Json接受部分资源
  9. Anguar 使用interceptor拦截器设置请求头传入jwt token
  10. C++ STL map 中insert函数返回值问题
  11. 用php写圣诞祝福页面,圣诞祝福文案 抖音圣诞节一句话祝福
  12. java 二叉树的创建 遍历
  13. Python3.x:pyodbc调用sybase的存储过程
  14. python监控桌面捕捉,用Python从屏幕上捕获视频数据
  15. feedsky绑定二级域名不能更新解决方法
  16. 利用数学软件Maxima求解电路的传递函数
  17. trick2-mobilenetv1、mobilenetv2、mobilenetv3替换YOLO主干
  18. NDK实践(一)在linux环境下编译ffmpe
  19. 微软高管:IT业正向个人计算时代转型
  20. 最轻的5号电池------耐时锂电池

热门文章

  1. 2021年中国电子展将举行,TCL蓄势待发,邀您见证科技风暴
  2. 日本著名企业家之一稻盛和夫
  3. 打印服务器应用设置指南,打印服务器快速安装指南
  4. 如何给惠普服务器安装windows server 2008操作系统
  5. Beginning 的搭配说明
  6. NDSL和PSP比较
  7. adk java,通过Android ADK从Thermistor读取的摄氏温度无效
  8. (swing读书笔记)JTree简介(下)
  9. office365 java,使用Office365发送Javamail
  10. 停止词(stop words)