Ladder (单调栈)
来源:互联网 发布:淘宝打电话需要理他吗 编辑:程序博客网 时间:2024/06/10 04:12
Ladder
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
Description
You've got an array, consisting of n integersa1, a2, ..., an. Also, you've gotm queries, the i-th query is described by two integersli, ri. Numbersli, ri define a subsegment of the original array, that is, the sequence of numbersali, ali + 1, ali + 2, ..., ari. For each query you should check whether the corresponding segment is a ladder.
A ladder is a sequence of integers b1, b2, ..., bk, such that it first doesn't decrease, then doesn't increase. In other words, there is such integerx(1 ≤ x ≤ k), that the following inequation fulfills:b1 ≤ b2 ≤ ... ≤ bx ≥ bx + 1 ≥ bx + 2... ≥ bk. Note that the non-decreasing and the non-increasing sequences are also considered ladders.
Input
The first line contains two integers n andm(1 ≤ n, m ≤ 105) — the number of array elements and the number of queries. The second line contains the sequence of integersa1, a2, ..., an(1 ≤ ai ≤ 109), where number ai stands for thei-th array element.
The following m lines contain the description of the queries. Thei-th line contains the description of thei-th query, consisting of two integers li,ri(1 ≤ li ≤ ri ≤ n) — the boundaries of the subsegment of the initial array.
The numbers in the lines are separated by single spaces.
Output
Print m lines, in the i-th line print word "Yes" (without the quotes), if the subsegment that corresponds to thei-th query is the ladder, or word "No" (without the quotes) otherwise.
Sample Input
8 61 2 1 3 3 5 2 11 32 32 48 81 45 8
YesYesNoYesNoYes题意:给出一个数列,m次询问,每次询问一个区间,判断这个区间是否是按照非递减和非递增变化的分析:对于每一个区间的端点,如果我们知道了左端点和右端点左右各能达到的最大高度的下标,那么我们就能判断这个区间是否是合法的,那么单调栈预处理一下就可以了#include<cstring>#include<string>#include<iostream>#include<queue>#include<cstdio>#include<algorithm>#include<map>#include<cstdlib>#include<cmath>#include<vector>//#pragma comment(linker, "/STACK:1024000000,1024000000");using namespace std;#define INF 0x3f3f3f3fint a[100005];int l[100005],r[100005];int s[100005];int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); l[i]=r[i]=i; } a[0]=-INF; a[n+1]=-INF; int p=-1; for(int i=0;i<=n+1;i++) { if(p>=0&&a[s[p]]>a[i]) { for(int j=0;j<p;j++) { r[s[j]]=s[p]; } p=-1; } s[++p]=i; } p=-1; for(int i=n+1;i>=0;i--) { if(p>=0&&a[s[p]]>a[i]) { for(int j=0;j<p;j++) { l[s[j]]=s[p]; } p=-1; } s[++p]=i; } while(m--) { int a,b; scanf("%d%d",&a,&b); if(l[a]==l[b]&&l[a]<=a) { printf("Yes\n"); } else if(r[a]==r[b]&&r[b]>=b) { printf("Yes\n"); } else if(r[a]==l[b]&&r[a]>=a&&r[a]<=b) { printf("Yes\n"); } else if(r[a]>=l[b]) { printf("Yes\n"); } else { printf("No\n"); } } } return 0;}
- Ladder (单调栈)
- 单调栈 单调队列
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- 单调栈
- src 和 href 的区别
- C# firebird嵌入式断开连接无法删除文件
- JS 异常之 missing ) after argument list 错误释疑
- No result defined for action and result input
- Hibernate 性能优化_转载
- Ladder (单调栈)
- 调用函数时为什么要在函数名前加“(void)”
- 十大排序算法
- 读《程序员自我修养》 总结
- Canvas容器绘制直线
- 关于使用“Hadoop free”版本的Spark
- JavaScript笔记3--封装JS对象
- 好久没更新博客了
- 第九章 字典