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. UE4 C++工程以Game模式启动

    UE4版本:4.24.3源码编译版本 Windows10 + VS2019环境 UE4 C++工程,默认情况下VS中直接运行是启动Editor模式: 有时为了调试等目的需要以Game模式启动,可以避免 ...

  2. Matlab | 绘制动态曲线(使用 animatedline 对象)

    效果如下: 示例代码: figure('Color','w'); h1 = animatedline; h1.Color = 'r'; h1.LineWidth = 1.0; h1.LineStyle ...

  3. 一个简单的BypassUAC编写

    什么是UAC? UAC是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码.通过在 ...

  4. 零基础学习java------40---------Maven(maven的概念,安装,maven在eclipse中使用),springboot(spring整合springmvc(注解),spring整合mybatis(常见的配置文件)),前端页面(bootstrap软件)

    一 maven 1. Maven的相关概念 1.1 项目开发中遇到的问题 (1)都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? (2)为什么在我的机器上可以正常打包,而配置管理 ...

  5. 修改 Gradle 插件(Plugins)的下载地址(repositories)

    Gradle 也可以用下面的方式声明使用的插件: 1234 // build.gradleplugins { id 'com.example.plugin', version '1.0'} 其实是从 ...

  6. Linux:cut命令...未完待续

    一.定义 正如其名,cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的. 2.剪切依据 cut命令主要是接受三 ...

  7. 【Spring Framework】Spring入门教程(二)基于xml配置对象容器

    基于xml配置对象容器--xml 标签说明 alias标签 作用:为已配置的bean设置别名 --applicationContext.xml配置文件 <?xml version="1 ...

  8. JpaRepository 增删改查

    Jpa查询 JpaRepository简单查询 基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL. 预先生成方法 spring data jpa 默 ...

  9. i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  10. 1888-jerry99的数列--factorial

    1 #define _CRT_SECURE_NO_WARNINGS 1//jerry99的数列 2 #include<bits/stdc++.h> 3 int prime[40000] = ...