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 Subsequence(HDU 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\) 思路 看到這種題目,應該條件反射的去想一下線段樹。 但首先還是從