zoukankan      html  css  js  c++  java
  • 【数据结构】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
    ",Mx-Mn);
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    Windows10用fiddler抓包Android应用(解决手机设置代理后无法上网,设置只抓app包)
    go语言数据库操作,xorm框架
    go语言数据库操作, gorm框架
    python 多线程 及多线程通信,互斥锁,线程池
    Selenium PageFactory
    VBScript学习笔记
    4种手机自动化测试框架介绍
    Behave + Selenium(Python) ------ (第四篇)
    Behave + Selenium(Python) ------ (第三篇)
    Behave + Selenium(Python) ------ (第二篇)
  • 原文地址:https://www.cnblogs.com/Tommyr7/p/6994073.html
Copyright © 2011-2022 走看看