1. 程式人生 > >HDU 3530 Subsequence

HDU 3530 Subsequence

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

 單調佇列。
用兩個單調佇列維護最大值和最小值。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
#define ll long long
#define getMax(a,b) a>b?a:b
#define getMin(a,b) a<b?a:b
const int N=1e+5+5;
int q[N],p[N],h1,h2,r1,r2;
int a[N];
int main()
{
    int n,m,k,i;
    while (~scanf("%d%d%d",&n,&m,&k))
        {
            h1=h2=r1=r2=0;
            int ans=0,cur=1;
            for (i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            while (h1<r1&&a[q[r1-1]]<a[i])  //遞減
                r1--;
            q[r1++]=i;
            while (h2<r2&&a[p[r2-1]]>a[i])  //遞增
                r2--;
            p[r2++]=i;
            while (h1<r1&&h2<r2&&a[q[h1]]-a[p[h2]]>k)  //選擇下標小的
            {
                if (q[h1]<p[h2])
                    cur=q[h1++]+1;
                else
                    cur=p[h2++]+1;
            }
            if (h1<r1&&h2<r2&&a[q[h1]]-a[p[h2]]>=m)
                if (ans<i-cur+1)
                ans=i-cur+1;
            }
            printf("%d\n",ans);
        }
    return 0;
}


相關推薦

HDU-3530 Subsequence(單調隊列)

clu lan lar ssi isf multi while for inline Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others

HDU 3530 Subsequence

Problem Description There is a sequence of integers. Your task is to find the longest subsequence that satisfies the following condition:

HDU-3530-Subsequence

     單調佇列很好的一個題目,我卻傻逼的用佇列寫了好久,最後才發現自己腦殘了。  程式碼: #include<cstdio> #include<cstring> #include<iostream> #include<queue

Subsequence HDU - 3530

sin 最小 mes pri blank 記錄 while point targe Subsequence HDU - 3530 方法:單調隊列區間最大最小 錯誤記錄(本地寫錯)的原因:寫成每次試著擴展右端點,卻難以正確地處理"在多擴展右端點之後減去多擴展的部分"這一任

2017中國大學生程序設計競賽 - 網絡選拔賽 HDU 6155 Subsequence Count 矩陣快速冪

htm 遞推關系 更新 ble pri -1 wap html sin 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6155 題意: 題解來自:http://www.cnblogs.com/iRedBean/p/739827

HDU 6155 Subsequence Count 線段樹維護矩陣

input ans ons tom thml other family 卡常 子序列 Subsequence Count Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 256000/256000 K (J

HDU.6155.Subsequence Count(線段樹 矩陣)

open har acm 就是 details efi ron git %d 題目鏈接 首先考慮詢問[1,n]怎麽做 設 f[i][0/1]表示[1,i]以0/1結尾的不同子序列個數 則\(if(A[i]) f[i][1] = f[i-1][0] + f[i-1][1] +

3530 Subsequence【單調佇列】

Time limit 1000 ms Memory limit 32768 kB There is a sequence of integers. Your task is to find the longest subsequence that satisfi

HDU 6155 Subsequence Count [線段樹維護矩陣]

題意:給你長度為n的01串,m個操作,每次操作有兩種 ①將區間[L,R]取反(0變1,1變0) ②詢問區間[L,R]的所有不同子序列的和 題解:首先我們考慮對於一個01串,我們如何知道它的不同的子序列個數。發現我們可以通過dp來求得 ①對於新加入的1來說,dp轉移方程為dp

HDU 6155 Subsequence Count(矩陣乘法+線段樹)

題意 給定一個長度為 \(n\) 的 \(01\) 串,完成 \(m\) 種操作——操作分兩種翻轉 \([l,r]\) 區間中的元素、求區間 \([l,r]\) 有多少個不同的子序列。 \(1 \leq n,m \leq 10^5\) 思路 看到這種題目,應該條件反射的去想一下線段樹。 但首先還是從

HDU 3530 單調佇列

Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3995    Accepted Sub

hdu 3530(單調佇列)

傳送門 題解: 用一個單調不升的佇列維護最大值,一個單調不減的佇列維護最小值。如果不滿足條件,後移答案區間左端點,取兩個佇列頭指標的元素較小的一個(位置儘量靠前使區間儘量長)。 #include&

HDU 3530 單調佇列

題意:給n個數和m,k,問你數列中最長的子序列,其中最大值減去最小值大於等於m小於等於k 思路:想著想著想到尺取去了,寫了一半實現不了((/ □ \)),一看單調佇列也沒怎麼練過,大致就只知道單調佇列肯定是維護一個什麼東西,只能看大神們的思路了,維護了兩個佇列,一個是以當

HDOJ 3530 Subsequence(單調佇列(含單調佇列詳解))

我們從最簡單的問題開始:給定一個長度為N的整數數列 a [ i ] , i = 0, 1 , . .. , N-1 和區間長度k.要求:      f ( i ) = max { a ( i - k + 1 ) , a ( i - k + 2 ) , . .. , a ( i ) } , i = 0 ,

hdu~3530(單調佇列)

單調佇列就是佇列中的元素是單調遞增或遞減的。比如把 5 2 3 1 4 入隊: 減:、、、、、、、、、、、增: 5 、、、、、、、、、、、、5 5 2 、、、、、、、、、、、2  5 3 、、、、、

hdu-1159 Common Subsequence (dp中的lcs問題)

contain asi dice spa ... con ive min iss Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O

hdu-1159 Common Subsequence

program ... clas mission ems 字符 mem example div 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=1159 題目類型: 最大公共子串 題意概括: 給出兩個字符串,求這兩個

HDU 4632 Palindrome subsequence(區間DP求回文子序列數)

pan get color math stdout 一個 inf 序列 star 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 題目大意:給你若幹個字符串,回答每個字符串有多少個回文子序列(可以不連續的子串)。解題

hdu 1159 Common Subsequence

== str printf clu DC max size c++ style hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh #include <bits/stdc++.h> using namespace std; i

題解報告:hdu 1159 Common Subsequence

com span add letter 子序列 rom har 公共子序列 using 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description 給定序列的子序列是給定的序列,其中有一些元