题目传送门

题意:问最长子序列,满足区间最大值 - 最小值在[m, k]之间

分析:用双端队列维护最大值和最小值,保存的是位置。当满足条件时,更新最大值。

/************************************************
* Author :Running_Time
* Created Time :2015/9/25 星期五 08:50:32
* File Name :A_deque.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
int a[N]; int main(void) {
int n, m, k;
while (scanf ("%d%d%d", &n, &m, &k) == 3) {
deque<int> Q1, Q2;
int ans = 0, l = 1;
for (int i=1; i<=n; ++i) {
scanf ("%d", &a[i]);
while (!Q1.empty () && a[Q1.back ()] <= a[i]) Q1.pop_back ();
Q1.push_back (i);
while (!Q2.empty () && a[Q2.back ()] >= a[i]) Q2.pop_back ();
Q2.push_back (i);
while (!Q1.empty () && !Q2.empty () && a[Q1.front ()] - a[Q2.front ()] > k) {
if (Q1.front () < Q2.front ()) {
l = Q1.front () + 1; Q1.pop_front ();
}
else {
l = Q2.front () + 1; Q2.pop_front ();
}
}
if (!Q1.empty () && !Q2.empty () && a[Q1.front ()] - a[Q2.front ()] >= m) {
if (ans < i - l + 1) ans = i - l + 1;
}
}
printf ("%d\n", ans);
} return 0;
}

数组模拟:

/************************************************
* Author :Running_Time
* Created Time :2015/9/22 星期二 15:49:25
* File Name :A.cpp
************************************************/ #include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std; #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-8;
int dq1[N], dq2[N], a[N]; int main(void) {
int n, m, k;
while (scanf ("%d%d%d", &n, &m, &k) == 3) {
for (int i=1; i<=n; ++i) {
scanf ("%d", &a[i]);
}
int f1 = 0, f2 = 0, b1 = 0, b2 = 0, l = 1;
int ans = 0;
for (int i=1; i<=n; ++i) {
while (f1 < b1 && a[dq1[b1-1]] <= a[i]) b1--;
dq1[b1++] = i;
while (f2 < b2 && a[dq2[b2-1]] >= a[i]) b2--;
dq2[b2++] = i;
while (f1 < b1 && f2 < b2 && a[dq1[f1]] - a[dq2[f2]] > k) {
if (dq1[f1] < dq2[f2]) {
l = dq1[f1++] + 1;
}
else l = dq2[f2++] + 1;
}
if (f1 < b1 && f2 < b2 && a[dq1[f1]] - a[dq2[f2]] >= m) {
ans = max (ans, i - l + 1);
}
}
printf ("%d\n", ans);
} return 0;
}

  

双端队列 HDOJ 3530 Subsequence的更多相关文章

  1. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  2. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  3. STL---deque(双端队列)

    Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...

  4. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  5. HDU 4286 Data Handler --双端队列

    题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...

  6. 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 41844   Accepted: 12384 ...

  7. Java 集合深入理解(10):Deque 双端队列

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...

  8. BZOJ2457 BeiJing2011 双端队列

    [问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序.  Sherry手头能用的工具就是若干个双端队列.        她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...

  9. Fork/Join框架之双端队列

    简介 ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue.数组下标queu ...

随机推荐

  1. Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除

    //由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值 IFeatureClass featureClass = null; //获取某个字段的索引,后面取字段值用 ...

  2. stm32GPIO8种模式

    stm32GPIO工作模式及用途  1.浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1       2.带上拉输入GPIO_IPU——IO内部上拉电阻输入       ...

  3. BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...

  4. SELECT INSTR(120,0000); 真

    sql 排故 SELECT  INSTR(120,0000);  真

  5. SimpleAdapter ArrayAdapter用法

    listView = (ListView) findViewById(R.id.list_main); /* String[] strings = {"A","A&quo ...

  6. JS点击查看更多内容 控制段落文字展开折叠

    JavaScript+jQuery实现的文字展开折叠效果,点击文字后文字内容会完整的显示出来,控制段落来显示文字,不需要的时候,可以再次点击后将内容折叠起来,也就是隐藏了一部分内容.点击查看更多的功能 ...

  7. skynet源码阅读<1>--lua与c的基本交互

    阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex ...

  8. codeforces 672A A. Summer Camp(水题)

    题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. [Selenium] 如何在老版本的Chrome 浏览器上使用selenium

    由于Chrome Driver 只兼容Chrome  浏览器12.0.712.0 和之后的新版本,会因此如果要在老版本的Chrome  浏览器上使用Selenium, 则只能使用 SeleniumRC ...

  10. 【HDU 4722】 Good Numbers

    [题目链接] 点击打开链接 [算法] f[i][j]表示第i位,数位和对10取模余j的数的个数 状态转移,计算答案都比较简单,笔者不再赘述 [代码] #include<bits/stdc++.h ...