1. 程式人生 > >【HDU3530】【單調佇列(雙)】Subsequence 【長度為n的數列,求最長子區間的長度,使得區間的最大值與最小值的差滿足一個範圍】

【HDU3530】【單調佇列(雙)】Subsequence 【長度為n的數列,求最長子區間的長度,使得區間的最大值與最小值的差滿足一個範圍】

描述:

Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6143    Accepted Submission(s): 2042


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
Source
Recommend zhengfeng   |   We have carefully selected several similar problems for you:  
3535
 3529 3528 3527 3415 
題意:

給你一個長度為n的數列,求最長子區間的長度,使得區間的最大值與最小值的差s滿足,
m<=s<=k

思路:

這題很容易想到用兩個單調佇列維護當前最值,
作為判斷條件,如果差值大於k了,就去掉較前面的那個佇列元素,並把區間頭更新為它的標號+1,

這裡注意差值小於m並不需要去掉元素,還有更新答案時要先判斷是否滿足條件才能更新。

程式碼:
#include <bits/stdc++.h>
#define pr(x) cout << #x << "= " << x << "  " ;
#define pl(x) cout << #x << "= " << x << endl;
#define ll __int64
using  namespace  std;

template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
    for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + '0');
    putchar('\n');
}

const int N=1e5+10;

int n,m,k,a[N];
int qmin[N],qmax[N];

int  main(){
  #ifndef ONLINE_JUDGE
  freopen("in.txt","r",stdin);
  #endif

  while(~scanf("%d%d%d",&n,&m,&k)){
    int lm=0,rm=0,lx=0,rx=0,ans=0,l=0;
    for(int i=1; i<=n; i++){
      read(a[i]);
      while(lm<rm && a[qmin[rm-1]]>a[i])rm--;//遞增
      while(lx<rx && a[qmax[rx-1]]<a[i])rx--;//遞減
      qmin[rm++]=i;
      qmax[rx++]=i;
      while(a[qmax[lx]]-a[qmin[lm]]>k){
        l=(qmin[lm]<qmax[lx])?qmin[lm++]:qmax[lx++];
      }
      if(a[qmax[lx]]-a[qmin[lm]]>=m){
        ans=max(ans, i-l);//因為l從0開始所以i-l不需要+1
      }
    }
    print(ans);
  }
  return 0;
}



相關推薦

HDU3530單調佇列Subsequence 長度n數列長子區間長度使得區間滿足一個範圍

描述: Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6143    Accep

c++中關於直接使用佇列queue的學習標頭檔案#include

對queue的淺認識 首先我們需要定義一個佇列之前,需要知道定義一個什麼型別的佇列,比如結構體型別的; queue<(結構體的名字)> (你定義的佇列名字); queue<node> M; queue中有幾個可以呼叫的函式,我們直接可以使用:

OpenLayers專案分析 資料解析以GML

前面也提到過,OpenLayers設計是符合標準的,有良好的框架結構和實現機制,非常值得學習。OpenLayers支援的格式比較多,有XML、GML、GeoJSON、GeoRSS、JSON、KML、WFS等。這回主要以GML為例來看OpenLayers 資料的解析過程。   

單調佇列 POJ2823

前幾天做過這題...當時使用線段樹做的....要跑9500MS才能過...今天看了下單調佇列...以為很難...但理解一下..發現單調佇列其實很簡單.. 單調佇列是從數列前掃到數列後...維護一個最值或者一個所需的最優解之類的...每次的最優解都是在佇列的頭....所以要一

聯賽模擬測試18 A. 施工 單調佇列優化DP

## 題目描述 ![](https://img2020.cnblogs.com/blog/1996139/202010/1996139-20201017112702146-883654574.png) ![](https://img2020.cnblogs.com/blog/1996139/202010/19

一個長度N的陣列中包含正數 負數 0請實現一個函式找出和0的長子數列

<strong><span style="font-size:18px;">// #include<iostream> #include<vector>

TP5.1whereOr的用法條件查詢

author:咔咔 wechat:fangkangfg   在平時的工作中,我們會遇到一些情況,比如; 最近我在寫TP5.1的商城部落格,裡邊就有一個這樣的需求 一個條件是校驗是否在角色許可權裡 一個條件就是需要校驗的許可權 這個時候就不知道sql怎麼

c#佇列Queue和MSMQ訊息佇列的基礎使用

    首先我們知道佇列是先進先出的機制,所以在處理併發是個不錯的選擇。然後就寫兩個佇列的簡單應用。 Queue 名稱空間     名稱空間:System.Collections,不在這裡做過多的理論解釋,這個東西非常的好理解。     可以看下官方文件:https://docs.microsof

DP計劃11.3——[BZOJ]股票交易單調佇列優化DPMEDIUM

Description 最近lxhgww又迷上了投資股票,通過一段時間的觀察和學習,他總結出了股票行情的一些規律。 通過一段時間的觀察,lxhgww預測到了未來T天內某隻股票的走勢,第i天的股票買入價為每股APi,第i天的股票賣出價為每股BPi(資料保證對於每個

貪心加工生產排程機排程貪心問題

問題 D: 【貪心】加工生產排程 時間限制: 1 Sec  記憶體限制: 64 MB 提交: 41  解決: 21 [提交] [狀態] [討論版] [命題人:外部匯入] 題目描述 有n個部件需在A、B機器上加工,每個工件都必須經過先A後B兩道工序。 已知:部件i在A

Linux程序間通訊IPC之訊息佇列詳解及測試用例

學習環境 Centos6.5 Linux 核心 2.6 什麼是訊息佇列? 訊息佇列是SystemV版本中三種程序通訊機制之一,另外兩種是訊號量和共享儲存段。訊息佇列提供了程序間傳送資料塊的方法,而且每個資料塊都有一個型別標識。訊息佇列是基於訊息的,而管

php面向對象

打電話 成員方法 駝峰命名 bject 內部 自動 正在 自己 div 1. 學習面向對象的目標:  a) 語法的學習:  b) 編程思想的學習:    i. 過程化:    ii. 面向對象:2. 比較(有對象和沒對象的區別)  a) 沒對象:    i. 我餓了 自己

php面向對象

row 操作類 面向對象 ssa getline var pre span 錯誤信息 一、 類型約束:  a) 約束函數可傳入的參數類型二、 類的遍歷  a) Foreach  b) 可以將類當中的所有成員屬性遍歷出來三、 關於操作類與對象的一些函數:  a) 判斷函數  

php面向對象

lamp1 變量 步驟 efi 第一個 面向對象 我們 ati 單例 知識點關鍵詞:FSCICATS一、 f => final:  a) 是一個修飾符,用來修飾類和成員方法  b) 使用final修飾符修飾的類不能被繼承,使用final修飾符修飾的成員方法,不能被重寫

Android自己定義組件系列6——進階實踐3

err ack XML @+ layout apk get ast edi 上一篇《Android自己定義組件系列【5】——進階實踐(2)》繼續對任老師的《可下拉的PinnedHeaderExpandableListView的實現》進行了分析,這一篇計劃中間插一段“知識點

Cloud FoundryCould Foundry學習——Could Foundry淺談

art lock mod out isp ted 組成 .com pop 在閱讀的過程中有不論什麽問題。歡迎一起交流 郵箱:[email protected]/* */ QQ:1494713801 Cloud Foundry是VMware

Android自己定義組件系列5——進階實踐2

col fonts tle 適配 pack tom ica void log 上一篇《Android自己定義組件系列【5】——進階實踐(1)》中對任老師的《可下拉的PinnedHeaderExpandableListView的實現》前一部分進行了實現,這一篇我們來看看Ex

Python自動化開發課堂筆記Day06 - Python進階

擴展性 程序 lex 類名 人物 優點 ini 參數 self. 類與對象 面向過程的程序設計:  優點:極大的降低了程序的復雜度  缺點:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即使能,也是得大改,改一個組件,牽一發而動全身面向對象的程序設計

原創淺談webview——驚鴻一瞥

版本 開發 spa 占用 混合 原創 大量 功能性 內存泄漏 眾所周知,APP開發過程中經常會通過webview實現HTML5(H5)的渲染,實現H5和Native的混合開發(Hybrid Development)。Hybrid Development可以加速

luogu_3379 模板最近公共祖先LCA

span oid ont return mes ace print next using #include<bits/stdc++.h>using namespace std;#define N 500010*2struct edge{int v,next;}