• 排队


    【题目描述】:

    每天,农夫约翰的N头奶牛总是按同一顺序排好队,有一天,约翰决定让一些牛玩一场飞盘游戏(Ultimate Frisbee),他决定在队列里选择一群位置连续的奶牛进行比赛,为了避免比赛结果过于悬殊,要求挑出的奶牛身高不要相差太大。

    约翰准备了Q组奶牛选择,并告诉你所有奶牛的身高Hi。他想知道每组里最高的奶牛和最矮的奶牛身高差是多少。

    注意:在最大的数据上,输入输出将占据大部分时间。

    【输入描述】:

    第一行,两个用空格隔开的整数N和Q。

    第2到第N+1行,每行一个整数,第i+1行表示第i头奶牛的身高Hi

    第N+2到第N+Q+1行,每行两个用空格隔开的整数A和B,表示选择从A到B的所有牛(1<=A<=B<=N)

    【输出描述】:

    共Q行,每行一个整数,代表每个询问的答案。

    【样例输入】:

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

    【样例输出】:

    6
    3
    0

    【时间限制、数据范围及描述】:

    时间:1s 空间:128M

    1<=N<=50,000; 1<=Q<=200,000; 1<=Hi<=10^6

    分析:

    本题问题是求“每组里最高的奶牛和最矮的奶牛身高差是多少”,故不难想到用ST表一类的算法求解。因此也就是一道模板题。。。

    CODE :

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<ctime>
     8 using namespace std;
     9 const int N=1000005,M=25;
    10 int n,q,a[N],f1[N][M],f2[N][M];
    11 int query1(int L,int R){
    12     int k;
    13     k=int(log(R-L+1)/log(2));
    14     return max(f1[L][k],f1[R+1-(1<<k)][k]);
    15 }
    16 int query2(int L,int R){
    17     int k;
    18     k=int(log(R-L+1)/log(2));
    19     return min(f2[L][k],f2[R+1-(1<<k)][k]);
    20 }
    21 int main(){
    22     scanf("%d%d",&n,&q);
    23     for(int i=1;i<=n;i++){
    24         scanf("%d",&a[i]);
    25     }
    26     memset(f2,0x3f,sizeof(f2));
    27     for(int i=1;i<=n;i++){
    28         f1[i][0]=f2[i][0]=a[i];
    29     }
    30     for(int j=1;j<=int(log(n)/log(2));j++){
    31         for(int i=1;i+(1<<j)-1<=n;i++){
    32             f1[i][j]=max(f1[i][j-1],f1[i+(1<<(j-1))][j-1]); 
    33        }
    34     }
    35     for(int j=1;j<=int(log(n)/log(2));j++){
    36         for(int i=1;i+(1<<j)-1<=n;i++){
    37             f2[i][j]=min(f2[i][j-1],f2[i+(1<<(j-1))][j-1]); 
    38        }
    39     }
    40     int l,r;
    41     for(int i=1;i<=q;i++){
    42         scanf("%d%d",&l,&r);
    43         printf("%d
    ",query1(l,r)-query2(l,r));
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    关于json字符串与实体之间的严格验证
    SQL Pretty Printer 一款值得你拥有的MSSQL格式化插件
    ABP增加记录EFCore 生成数据库脚本日志到新的txt文件
    Multiple types were found that match the controller named 'Auth'.
    sqlserver 交叉去重
    sqlserver分组排序取前三条数据
    C# 读取.resx资源文件写入到json文件中
    SqlServer根据经纬度排序
    .net core 简单定时程序
    使用游标,查询一张的数据往另外三张表里面添加数据
  • 原文地址:https://www.cnblogs.com/kanchuang/p/11194062.html
Copyright © 2020-2023  润新知