1. 程式人生 > >Subsequence HDU

Subsequence HDU

題意:給你n,m,k以及一陣列,n個元素,求一個序列使得序列裡最大值減去最小值>=m且<k,求這個序列的最大長度,序列必須連續。

思路:用單調棧維護一個單調遞增序列和一個單調遞減序列,計算兩個單調棧的棧底元素的差值分別跟m,k 作比較得出序列的最大值。詳細看程式碼,註釋很詳細

#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N],maxx[N],minn[N],n,m,k;//maxx陣列維護單調遞減序列,存的是下標,棧底元素最大,minn陣列反之
int main()
{
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        //front為頭指標,tail尾指標
        int front1=0,tail1=-1,front2=0,tail2=-1,flag=-1,ans=0;
        for(int i=0;i<n;i++)
        {
            //頭指標小於尾指標且當前元素大於棧頂元素時讓尾指標減一,即讓使棧頂元素出棧,因為要維護一個單調遞減序列
            while(front1<=tail1&&a[i]>a[maxx[tail1]]) tail1--;
            maxx[++tail1]=i;
            while(front2<=tail2&&a[i]<a[minn[tail2]]) tail2--;
            minn[++tail2]=i;
            //兩個棧的棧頂元素,一個是存的是陣列中最大的元素下標一個是陣列中最小的元素下標
            //用最大的減去最小的分別跟m,k比較
            while(a[maxx[front1]]-a[minn[front2]]>k)
            {
                flag=min(maxx[front1],minn[front2]);//選擇更小的下標讓其++
                if(flag==maxx[front1]) front1++;
                if(flag==minn[front2]) front2++;
            }
            if(a[maxx[front1]]-a[minn[front2]]>=m)//記錄答案
                ans=max(ans,i-flag);
        }
        printf("%d\n",ans);
    }
}

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

相關推薦

Subsequence HDU - 3530

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

Longest Increasing Subsequence HDU - 6284

/* 首先預處理好f g陣列 fi :以a[i]為結尾的 最長上升子序列的長度 gi :以a[i]為開始的 最長上升子序列的長度 mxx : 最長上升子序列的長度 線段樹優化 nlogn (不包含a[i]==0) 顯然把所有0換成x 只可能是mxx變成mxx+1 然

Longest Increasing Subsequence HDU

思路:因為改變的數是同一個,所以最後對LIS的貢獻最多隻能是1,所以可以先求出最長上升子序列長度,然後每個改變的數,考慮它對LIS的加成是1還是0. 設a[i]表示已第i項結束的最長上升子序列長度,b[i]表示以第i項為起點的最長上升子序列長度。 考慮在0的左邊找一個a[

Subsequence HDU

題意:給你n,m,k以及一陣列,n個元素,求一個序列使得序列裡最大值減去最小值>=m且<k,求這個序列的最大長度,序列必須連續。 思路:用單調棧維護一個單調遞增序列和一個單調遞減序列,計算兩個單調棧的棧底元素的差值分別跟m,k 作比較得出序列的最大值。詳細看程式

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 題目類型: 最大公共子串 題意概括: 給出兩個字符串,求這兩個

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-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.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] +

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 給定序列的子序列是給定的序列,其中有一些元

1014 - 最長公共上升子序列 - Greatest Common Increasing SubsequenceHDU 1423)

傳送門   分析 好優秀的一道題啊…… 我學過最長公共子序列,也會最長上升子序列 但mix在一起,我就糊塗了 其實也還好 我們相當於在最長公共子序列的基礎上多一個條件:要求數值遞增 還記得最長公共子序列是怎麼求的嗎? 定義:F[i,j]表示處

HDU-1159-Common Subsequence

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > an

HDU 1159 Common Subsequence(LCS)

當s1[s]=s2[t]時,在公共子串末尾加上s1[s] 當s1[s]!=s2[t]時,s1當前長度減1與s2比;s2當前長度減1與s1比 if (s1[s] == s2[t]) { dp[s+1][t+1] = dp[s][t] + 1;

HDU 4991 線段樹 Ordered Subsequence

最近在做一套線段樹 | | 樹狀陣列的題目,感覺題目不錯,分享一下 A numeric sequence of a i is ordered if a 1<a 2<……<a N. Let the subsequence of the given n

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

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

HDU 1159.Common Subsequence【動態規劃DP】【3月8】

Common Subsequence Problem Description A subsequence of a given sequence is the given sequence with some elements (possible none) lef

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

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