HDU 3530 Subsequence(区间最值差>=m且<=k的最大长度、双单调队列)
来源:互联网 发布:淘宝店铺信用卡套现 编辑:程序博客网 时间:2024/05/17 23:23
题目链接:
HDU 3530 Subsequence
题意:
给一个长度为
数据范围:
分析:
因为是在做单调队列的题,所以往单调队列上想可能容易点。
首先我们考虑以
时间复杂度:
#include <stdio.h>#include <string.h>#include <algorithm>#include <math.h>#include <climits>using namespace std;const int MAX_N = 100010;int n, m, k, head_dec, tail_dec, head_inc, tail_inc;int dec[MAX_N], inc[MAX_N], data[MAX_N];int main(){ while (~scanf("%d%d%d", &n, &m, &k)) { head_dec = tail_dec = head_inc = tail_dec = 0; for (int i = 0; i < n; ++i) { scanf("%d", &data[i]); } if(m > k) { printf("0\n"); continue; } memset(dec, 0, sizeof(dec)); memset(inc, 0, sizeof(inc)); int ans = 0, diff, pre = 0; for (int i = 0; i < n; ++i) { while (head_inc != tail_inc && data[i] < data[inc[tail_inc - 1]]) --tail_inc; inc[tail_inc++] = i; while (head_dec != tail_dec && data[i] > data[dec[tail_dec - 1]]) --tail_dec; dec[tail_dec++] = i; while(1) { diff = data[dec[head_dec]] - data[inc[head_inc]]; if (diff > k) { if (dec[head_dec] < inc[head_inc]) { pre = dec[head_dec] + 1; head_dec++; } else { pre = inc[head_inc] + 1; head_inc++; } } else break; } diff = data[dec[head_dec]] - data[inc[head_inc]]; if(diff >= m) ans = max(ans, i - pre + 1);// printf("i = %d head_dec = %d head_inc = %d ans = %d\n", i, dec[head_dec], inc[head_inc], ans);// printf("Max = %d Min = %d\n", data[dec[head_dec]], data[inc[head_inc]]); } printf("%d\n", ans); } return 0;}
0 0
- HDU 3530 Subsequence(区间最值差>=m且<=k的最大长度、双单调队列)
- 长度不超过k的最大连续子序列(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence(长度不超过k的最大连续子序列和,单调队列)
- HDU 3530 Subsequence 【单调队列】
- hdu 3530 Subsequence //单调队列
- hdu 3530 Subsequence 单调队列
- Hdu 3530 Subsequence 单调队列
- hdu 3530 Subsequence(单调队列)
- 单调队列 HDU 3530 Subsequence
- hdu 3530 Subsequence 单调队列
- hdu 3530 Subsequence 单调队列
- HDU - 3530 Subsequence 单调队列
- hdu 3530 Subsequence 单调队列
- HDU 3530 --- Subsequence 单调队列
- 求最大子区间,是差值在m与k之间【单调队列】
- 【HDU3530】【单调队列(双)】Subsequence 【长度为n的数列,求最长子区间的长度,使得区间的最大值与最小值的差满足一个范围】
- 【hdu3415】【单调队列 】Max Sum of Max-K-sub-sequence【求长度不大于k的区间最大子串和】
- tyvj 1305 —— 长度不超过m的最大连续和 【前缀和+单调队列】
- JAVA中的String 以及Interger 类型的总结
- 题目217 a letter and a number
- [01背包]vijos1625 精卫填海
- 如何在Ubuntu中打开PIXHAWK终端
- Android中RadioGroup和Fragment的应用
- HDU 3530 Subsequence(区间最值差>=m且<=k的最大长度、双单调队列)
- Retrofit2.0 公共参数(固定参数)
- A Knight's Journey--DFS
- CRT+容斥定理——Luck7 ( HDU 5768 ) ( 2016 Multi-University Training Contest 4 1005 )
- android studio 中 R.java 在哪
- 详细分析Linux动态库的使用方式
- Hbase迁移备份(后续更新)
- 常见编译错误信息
- Linux常用命令