双端队列 HDOJ 3530 Subsequence
题意:问最长子序列,满足区间最大值 - 最小值在[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的更多相关文章
- lintcode二叉树的锯齿形层次遍历 (双端队列)
题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- STL---deque(双端队列)
Deque是一种优化了的.对序列两端元素进行添加和删除操作的基本序列容器.它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结 ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 41844 Accepted: 12384 ...
- Java 集合深入理解(10):Deque 双端队列
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- Fork/Join框架之双端队列
简介 ForkJoinPool管理着ForkJoinWorkerThread线程,ForkJoinWorkerThread线程内部有一个双端队列,这个双端队列主要由一个数组queue.数组下标queu ...
随机推荐
- Arcgis Engine(ae)接口详解(3):featureClass的feature编辑和删除
//由于测试数据不完善,featureClass在此要只设null值,真实功能要设实际的值 IFeatureClass featureClass = null; //获取某个字段的索引,后面取字段值用 ...
- stm32GPIO8种模式
stm32GPIO工作模式及用途 1.浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1 2.带上拉输入GPIO_IPU——IO内部上拉电阻输入 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
- SELECT INSTR(120,0000); 真
sql 排故 SELECT INSTR(120,0000); 真
- SimpleAdapter ArrayAdapter用法
listView = (ListView) findViewById(R.id.list_main); /* String[] strings = {"A","A&quo ...
- JS点击查看更多内容 控制段落文字展开折叠
JavaScript+jQuery实现的文字展开折叠效果,点击文字后文字内容会完整的显示出来,控制段落来显示文字,不需要的时候,可以再次点击后将内容折叠起来,也就是隐藏了一部分内容.点击查看更多的功能 ...
- skynet源码阅读<1>--lua与c的基本交互
阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex ...
- codeforces 672A A. Summer Camp(水题)
题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...
- [Selenium] 如何在老版本的Chrome 浏览器上使用selenium
由于Chrome Driver 只兼容Chrome 浏览器12.0.712.0 和之后的新版本,会因此如果要在老版本的Chrome 浏览器上使用Selenium, 则只能使用 SeleniumRC ...
- 【HDU 4722】 Good Numbers
[题目链接] 点击打开链接 [算法] f[i][j]表示第i位,数位和对10取模余j的数的个数 状态转移,计算答案都比较简单,笔者不再赘述 [代码] #include<bits/stdc++.h ...