codeforces 279C Ladder(数据技巧)
2017-07-14 11:01
302 查看
You've got an array, consisting of n integers a1, a2, ..., an.
Also, you've got mqueries, the i-th query is described by two integers li, ri.
Numbers li, ri define a subsegment of the original array, that is, the sequence of numbers ali, 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 integer x (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 and m (1 ≤ n, m ≤ 105) — the number of array elements and
the number of queries. The second line contains the sequence of integers a1, a2, ..., an (1 ≤ ai ≤ 109),
where number ai stands for the i-th array element.
The following m lines contain the description of the queries. The i-th line contains the description of the i-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 the i-th
query is the ladder, or word "No" (without the quotes) otherwise.
Example
Input
Output
【题解】
这个题刚开始直接跳了,后来做的时候本来想用三分法找山峰,但是TLE了,所以又开始想别的方法,观察了好久终于发现可以双向扫,标记出每个数向左向右能延伸的最大长度,遇到比本身大的就停止计数,一直扫完为止,最后输入查询区间后只要判断左端点是不是小于右端点的计数值就好。
【AC代码】
Also, you've got mqueries, the i-th query is described by two integers li, ri.
Numbers li, ri define a subsegment of the original array, that is, the sequence of numbers ali, 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 integer x (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 and m (1 ≤ n, m ≤ 105) — the number of array elements and
the number of queries. The second line contains the sequence of integers a1, a2, ..., an (1 ≤ ai ≤ 109),
where number ai stands for the i-th array element.
The following m lines contain the description of the queries. The i-th line contains the description of the i-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 the i-th
query is the ladder, or word "No" (without the quotes) otherwise.
Example
Input
8 6 1 2 1 3 3 5 2 1 1 3 2 3 2 4 8 8 1 4 5 8 cc44
Output
Yes Yes No Yes No Yes
【题解】
这个题刚开始直接跳了,后来做的时候本来想用三分法找山峰,但是TLE了,所以又开始想别的方法,观察了好久终于发现可以双向扫,标记出每个数向左向右能延伸的最大长度,遇到比本身大的就停止计数,一直扫完为止,最后输入查询区间后只要判断左端点是不是小于右端点的计数值就好。
【AC代码】
# include <iostream> # include <cstdio> # include <cstring> # include <algorithm> # include <queue> # include <vector> # include <cmath> # define INF 0x3f3f3f3f using namespace std; const int N = 1e5; int a , R , L ; int main(void) { int n, m, i, l, r; while (~scanf("%d %d", &n, &m)) { for (i = 1; i <= n; i++) scanf("%d", &a[i]); R = n; for (i = n-1; i >= 1; i--){ if (a[i] > a[i+1]) R[i] = i; else R[i] = R[i+1]; } L[1] = 1; for (i = 2; i <= n; i++){ if (a[i] > a[i-1]) L[i] = i; else L[i] = L[i-1]; } while (m--){ scanf("%d %d", &l, &r); if (L[r] <= R[l]) printf("Yes\n"); else printf("No\n"); } } return 0; }
相关文章推荐
- codeforces --- 279C Ladder
- [CodeForces 279C] Ladder (DP)
- CodeForces 279C Ladder (RMQ + dp)
- U盘防止数据丢失有技巧
- DataGrid前台数据绑定技巧
- 谈谈IOCP发送数据时的一些误区及技巧
- ASP.NET数据绑定GridView控件使用技巧
- ASP.NET2.0中Gridview中数据操作技巧
- 手机数据抓包以及wireshark技巧
- codeforces 279C C. Ladder(rmq+预处理)
- 浅谈数据库设计技巧(上)技巧设计数据库类别商品允许数据类型
- SAS技巧-将输出数据转向到内存的一种方法
- 60个数据窗口技巧
- 数据库表设计原则技巧
- 数据仓库建模与ETL实践技巧
- java 如何处理大数据---技巧
- 数据仓库建模与ETL实践技巧[from]
- 关于php串口接收和发送数据的几点技巧
- 01- - -1.获得项目中info.plist文件的内容 2.沙盒的数据存储及读取 3.控制器view的高度和状态栏statusBar的关系 4.[UIScreen mainScreen].applicationFrame的取值 5.按钮的状态 6.错误调试技巧 7.按钮的各种状态设置
- CodeForces 279C