Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6141    Accepted Submission(s): 2041

Problem Description
There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition: the difference between the maximum element and the minimum element of the subsequence is no smaller than m and no larger than k.
 
Input
There are multiple test cases.
For each test case, the first line has three integers, n, m and k. n is the length of the sequence and is in the range [1, 100000]. m and k are in the range [0, 1000000]. The second line has n integers, which are all in the range [0, 1000000].
Proceed to the end of file.
 
Output
For each test case, print the length of the subsequence on a single line.
 
Sample Input
5 0 0
1 1 1 1 1
5 0 3
1 2 3 4 5
 
Sample Output
5
4
思路:优先队列+尺取;
我们不用去管这个子串中的最大最小的距离是否大于等于m,我们只要保证这个值小于等于k时继续向右端扩展,应为向右端扩展尺取时,当前值是越来越大的。比如当[l,r]满足dis>=m,那么[l,r+s],的dis>=m;所以我们不需要管m。然后就是尺取中,更新最大最小值的问题,这个用优先队列维护下。复杂度N*log(N);
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<stdlib.h>
6 #include<queue>
7 #include<stack>
8 using namespace std;
9 typedef long long LL;
10 int ask[100005];
11 int cnt[100005];
12 struct node1
13 {
14 int x;
15 int id;
16 bool operator<(const node1 &cx)const
17 {
18 if(cx.x == x)
19 return cx.id<id;
20 else return cx.x>x;
21 }
22 };
23 struct node2
24 {
25 int x;
26 int id;
27 bool operator<(const node2 &cx)const
28 {
29 if(cx.x == x)
30 return cx.id<id;
31 else return cx.x<x;
32 }
33 };
34 priority_queue<node1>que1;
35 priority_queue<node2>que2;
36 int main(void)
37 {
38 int n,m,k;
39 while(scanf("%d %d %d",&n,&m,&k)!=EOF)
40 {
41 while(!que1.empty())que1.pop();
42 while(!que2.empty())que2.pop();
43 int i,j;
44 for(i = 0; i < n; i++)
45 {
46 scanf("%d",&ask[i]);
47 }
48 int l = 0;
49 int r = 0;
50 int cc = 0;
51 int ma = ask[0];
52 int mi = ask[0];
53 int x = abs(ma-mi);
54 if(x <= k&&x >= m)cc = 1;
55 node1 ak;
56 node2 ap;
57 ak.x =ask[0];
58 ak.id = 0;
59 ap.x = ask[0];
60 ap.id = 0;
61 que1.push(ak);
62 que2.push(ap);
63 while(l<=r&&r<n)
64 {
65 while(x <= k &&r < n-1)
66 {
67 r++;
68 int c = abs(ask[r]-ma);
69 c = max(abs(ask[r]-mi),c);
70 if(c > k)
71 { //printf("%d %d\n",l,r);
72 r--;
73 break;
74 }
75 node1 ac;
76 ac.x = ask[r];
77 ac.id = r;
78 node2 bc;
79 bc.x= ask[r];
80 bc.id = r;
81 que1.push(ac);
82 que2.push(bc);
83 if(ask[r] > ma)
84 {
85 ma = ask[r];
86 }
87 else if(ask[r] < mi)
88 {
89 mi = ask[r];
90 }
91 x = abs(ma-mi);//printf("%d\n",x);
92 }
93 if(x >= m)
94 {
95 cc = max(cc,r-l+1);
96 }
97 if(ask[l] == ma)
98 {
99 while(!que1.empty())
100 {
101 node1 acc = que1.top();
102 if(acc.id <= l)
103 {
104 que1.pop();
105 }
106 else
107 {
108 ma = acc.x;
109 break;
110 }
111 }
112 }
113 if(ask[l]==mi)
114 {
115 while(!que2.empty())
116 {
117 node2 acc = que2.top();
118 if(acc.id <= l)
119 {
120 que2.pop();
121 }
122 else
123 {
124 mi = acc.x;
125 break;
126 }
127 }
128 }
129 l++;
130 if(l == r+1)
131 { //printf("%d\n",r);
132 r++;
133 node1 akk;
134 node2 app;
135 akk.x =ask[r];
136 akk.id = r;
137 app.x = ask[r];
138 app.id = r;
139 que1.push(akk);
140 que2.push(app);
141 mi = ask[r];
142 ma = ask[r];
143 }
144 }
145 printf("%d\n",cc);
146 }
147 return 0;
148 }
 

Subsequence(hdu3530)的更多相关文章

  1. HDUOJ ---1423 Greatest Common Increasing Subsequence(LCS)

    Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536 ...

  2. Poj 2533 Longest Ordered Subsequence(LIS)

    一.Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequenc ...

  3. 1423 Greatest Common Increasing Subsequence (LCIS)

    讲解摘自百度; 最长公共上升子序列(LCIS)的O(n^2)算法? 预备知识:动态规划的基本思想,LCS,LIS.? 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列).? 首先我们可 ...

  4. Subsequence(HDU3530+单调队列)

    题目链接 传送门 题面 题意 找到最长的一个区间,使得这个区间内的最大值减最小值在\([m,k]\)中. 思路 我们用两个单调队列分别维护最大值和最小值,我们记作\(q1\)和\(q2\). 如果\( ...

  5. POJ 2533-Longest Ordered Subsequence(DP)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 34454   Acc ...

  6. HPU第三次积分赛-D:Longest Increasing Subsequence(DP)

    Longest Increasing Subsequence 描述 给出一组长度为n的序列,a1​,a2​,a3​,a4​...an​, 求出这个序列长度为k的严格递增子序列的个数 输入 第一行输入T ...

  7. HDU 1423 Greatest Common Increasing Subsequence(LCIS)

    Greatest Common Increasing Subsequenc Problem Description This is a problem from ZOJ 2432.To make it ...

  8. Longest common subsequence(LCS)

    问题 说明该问题在生物学中的实际意义 Biological applications often need to compare the DNA of two (or more) different ...

  9. 第六周 Leetcode 446. Arithmetic Slices II - Subsequence (HARD)

    Leetcode443 题意:给一个长度1000内的整数数列,求有多少个等差的子数列. 如 [2,4,6,8,10]有7个等差子数列. 想了一个O(n^2logn)的DP算法 DP[i][j]为 对于 ...

随机推荐

  1. kubernetes 用到的工具及组件

    kubernetes 用到的工具及组件,将所有的组件下载后放到/usr/local/bin目录下(记得chmod a+x /usr/local/bin/*).所有的组件,原则上都用最新的,如果遇到不支 ...

  2. 从零开始学习oracle

    引用博客:https://blog.csdn.net/qq_36998053/article/details/82725765 )Oracle之<环境配置> (二)Oracle之<基 ...

  3. Visual Studio Code常用操作整理

    Live Server插件可以在保存html文件后实时地刷新页面 在html文件中键入"! +Tap"会生成一个html模板 保存文件:Ctrl+S 文件跳转:Ctrl+P 文件内 ...

  4. javaSE中级篇3——集合体系(另外一种存储容器)——更新完毕

    集合还是一种工具,所以它们的包都在java.util包下 1.集合的整个体系结构(是需要掌握的体系,完全体系不是这样) 对图中所说的 序和重复 这两词的说明: 序:指的是添加进去的元素和取出来的元素 ...

  5. 浅谈MySQL数据库面试必要掌握知识点

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 MySQL官方地址 https://www.mysql.com/ MySQL 8系列最新版本为8.0.27,5系列的最 ...

  6. Java交换数组元素

    Java 交换数组元素 代码示例 import java.util.Arrays; import java.util.Collections; import java.util.List; impor ...

  7. Redis(一)【基础入门】

    目录 一.大型网站的系统特点 二.大型网站架构发展历程 三.从NoSQL说起 四.Redis简介 五.Redis安装 1.上传并解压 2.安装C语言编译环境 3.修改安装位置 4.编译安装 5.启动R ...

  8. 双向循环链表模板类(C++)

    双向链表又称为双链表,使用双向链表的目的是为了解决在链表中访问直接前驱和后继的问题.其设置前驱后继指针的目的,就是为了节省其时间开销,也就是用空间换时间. 在双向链表的每个节点中应有两个链接指针作为它 ...

  9. Maven pom.xml报错解决

    用Maven建了一个web工程,总是在pom.xml头的地方报错: 大概是: Original error: Could not transfer artifact org.hamcrest:hamc ...

  10. treeTable实现排序

    /* * * TreeTable 0.1 - Client-side TreeTable Viewer! * @requires jQuery v1.3 * * Dual licensed under ...