HDU3530 單調佇列的應用
http://acm.hdu.edu.cn/showproblem.php?pid=3530
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.
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
/**
HDU 3530 單調佇列的應用
題意:
給定一段序列,求出最長的一段子序列使得該子序列中最大最小隻差x滿足m<=x<=k。
解題思路:
建立兩個單調佇列分別遞增和遞減維護(頭尾刪除,只有尾可插入)
Max - Min 為兩個佇列的隊首之差while(Max-Min>K) 看哪個的隊首元素比較前就移動誰的
最後求長度時,需要先記錄上一次的被淘汰的最值位置last ,這樣[last+1,i]即為滿足條件的連續子序列了
i - last
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=100005;
int q_max[N],q_min[N];//遞增,遞減
int a[N],n,m,k;
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int head_min=0,head_max=0,tail_min=0,tail_max=0;
int left1=0,left2=0;
int maxx=0;
for(int i=1;i<=n;i++)
{
while(head_min<tail_min&&a[q_min[tail_min-1]]<=a[i])
tail_min--;
while(head_max<tail_max&&a[q_max[tail_max-1]]>=a[i])
tail_max--;
q_max[tail_max++]=q_min[tail_min++]=i;
/* printf("***%d 遞減、遞增***\n",i);
for(int j=head_min;j<tail_min;j++)
printf("%d ",a[q_min[j]]);
printf("\n");
for(int j=head_max;j<tail_max;j++)
printf("%d ",a[q_max[j]]);
printf("\n");*/
while(a[q_min[head_min]]-a[q_max[head_max]]>k)
{
if(q_min[head_min]<q_max[head_max])
left1=q_min[head_min++];
else
left2=q_max[head_max++];
}
if(a[q_min[head_min]]-a[q_max[head_max]]>=m)
maxx=max(maxx,i-max(left1,left2));
}
printf("%d\n",maxx);
}
return 0;
}
/*
5 2 3
1 -1 2 -6 5
5 1 3
1 2 3 4 5
6 0 0
-1 0 2 1 125 -5
*/
相關文章
- 單調佇列佇列
- 單調棧/單調佇列佇列
- 單調佇列雙端佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- POJ2823 Sliding Window (單調佇列的基本應用)佇列
- redis訊息佇列簡單應用Redis佇列
- POJ 2823 單調佇列佇列
- hdu 3415 單調佇列佇列
- HDU 3530 單調佇列佇列
- hdu 3401 單調佇列+DP佇列
- hdu 4122 單調佇列佇列
- 單調佇列最佳化 DP佇列
- POJ 3017 單調佇列dp佇列
- hdu4374單調佇列+dp佇列
- 佇列-單端佇列佇列
- 訊息佇列系列一:訊息佇列應用佇列
- 佇列:佇列線上程池等有限資源池中的應用佇列
- 多重揹包問題的單調佇列優化佇列優化
- netcore下RabbitMQ佇列、死信佇列、延時佇列及小應用NetCoreMQ佇列
- Team Queue (佇列的一種應用)佇列
- java軟引用在佇列的應用Java佇列
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列
- noi.ac #289. 電梯(單調佇列)佇列
- HDU 3530 Subsequence (dp+單調佇列)佇列
- poj3017 dp+單調佇列佇列
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- 陣列模擬佇列 以及佇列的複用(環形佇列)陣列佇列
- Laravel Queues 佇列應用實戰Laravel佇列
- hdu3415 單調佇列求區間最大和佇列
- hdu 4122Alice's mooncake shop(單調佇列)佇列
- [學習筆記] 單調佇列最佳化DP - DP筆記佇列
- laravel 佇列的簡單使用Laravel佇列
- POJ 2823Sliding Window(單調佇列水題)佇列
- 單調棧理解及應用
- 訊息佇列常見的 5 個應用場景佇列
- 訊息佇列常見的5個應用場景佇列
- 堆和堆的應用:堆排序和優先佇列排序佇列