【数据结构】bzoj1636/bzoj1699排队

Description

每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的选择和所有牛的身高 (1 <= 身高 <= 1,000,000). 他想知道每一组里面最高和最低的牛的身高差别. 注意: 在最大数据上, 输入和输出将占用大部分运行时间.

Input

* 第一行: N 和 Q. * 第2..N+1行: 第i+1行是第i头牛的身高.

 * 第N+2..N+Q+1行: 两个整数, A 和 B (1 <= A <= B <= N), 表示从A到B的所有牛.

Output

*第1..Q行: 所有询问的回答 (最高和最低的牛的身高差), 每行一个.

Sample Input

6 3
1
7
3
4
2
5
1 5
4 6
2 2

Sample Output

6
3
0
 
 
 
============================================华丽丽的分割线============================================
这题好像没卡线段数耶~~~
直接倍增预处理最大值最小值,然后就可以支持O(1)询问辣~
RMQ经典题,时间复杂度O(nlogn+q),代码如下:
 1 #include <bits/stdc++.h>
 2 #define Maxn 50007
 3 using namespace std;
 4 int read()
 5 {
 6     int x=0,f=1;char ch=getchar();
 7     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
 8     while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
 9     return x*f;
10 }
11 int n,q;
12 int a[Maxn];
13 int mx[Maxn][27],mn[Maxn][27];
14 int query1(int lx, int rx)
15 {
16     int l=0;
17     while ((1<<l)<=rx-lx+1) ++l;
18     --l;
19     return max(mx[lx][l],mx[rx-(1<<l)+1][l]);
20 }
21 int query2(int lx, int rx)
22 {
23     int l=0;
24     while ((1<<l)<=rx-lx+1) ++l;
25     --l;
26     return min(mn[lx][l],mn[rx-(1<<l)+1][l]);
27 }
28 int main()
29 {
30     n=read(),q=read();
31     for (int i=1;i<=n;i++)
32         a[i]=read();
33     memset(mx,0,sizeof(mx));
34     memset(mn,0,sizeof(mn));
35     for (int i=1;i<=n;i++)
36         mx[i][0]=a[i],mn[i][0]=a[i];
37     for (int i=1;i<=20;i++)
38         for (int j=1;j<=n;j++)
39         {
40             int k=j+(1<<(i-1));
41             mx[j][i]=mx[j][i-1];
42             mn[j][i]=mn[j][i-1];
43             if (k<=n)
44             {
45                 mx[j][i]=max(mx[j][i],mx[k][i-1]);
46                 mn[j][i]=min(mn[j][i],mn[k][i-1]);
47             }
48         }
49     while (q--)
50     {
51         int lx=read(),rx=read();
52         int Mx=query1(lx,rx),Mn=query2(lx,rx);
53         printf("%d\n",Mx-Mn);
54     }
55     return 0;
56 }

 

posted @ 2017-06-12 17:28  Tommyr7  阅读(387)  评论(0编辑  收藏  举报