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