• 士兵杀敌(三)(线段树)


    士兵杀敌(三)

    时间限制:2000 ms  |  内存限制:65535 KB
    难度:5
    描述

    南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。

    所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。

    现在,请你写一个程序,帮小工回答南将军每次的询问吧。

    注意,南将军可能询问很多次。

    输入
    只有一组测试数据
    第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1<N<=100000,1<Q<=1000000)
    随后的一行有N个整数Vi(0<=Vi<100000000),分别表示每个人的杀敌数。
    再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
    输出
    对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。
    样例输入
    5 2
    1 2 6 9 3
    1 2
    2 4
    样例输出
    1
    7
    题解:线段树;还可以用RMQ算法,感觉挺复杂,也没看。。。还有宏定义最好大写。。。。。
    代码:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 #include<algorithm>
     6 //#define LOCAL
     7 #define lson root<<1,l,mid
     8 #define rson root<<1|1,mid+1,r
     9 #define L tree[root].l
    10 #define R tree[root].r
    11 #define MA tree[root].ma
    12 #define MI tree[root].mi
    13 #define NOW1 MA=max(tree[root<<1].ma,tree[root<<1|1].ma)
    14 #define NOW2 MI=min(tree[root<<1].mi,tree[root<<1|1].mi)
    15 using namespace std;
    16 const int INF=0x3f3f3f3f;
    17 const int MAXN=100010;
    18 struct Node{
    19     int l,r,ma,mi;
    20 };
    21 Node tree[MAXN<<2];
    22 int ax,ai;
    23 void build(int root,int l,int r){
    24     L=l;R=r;
    25     if(l==r){
    26         scanf("%d",&MA);
    27         MI=MA;
    28     }
    29     else{
    30         int mid=(l+r)>>1;
    31         build(lson);
    32         build(rson);
    33         NOW1;NOW2;
    34     }
    35 }
    36 void query(int root,int x,int y){
    37     if(L>=x&&R<=y){
    38         ax=max(ax,MA);
    39         ai=min(ai,MI);
    40     }
    41     else{
    42         int mid=(L+R)>>1;
    43         if(mid>=x)query(root<<1,x,y);
    44         if(mid<y)query(root<<1|1,x,y);
    45     }
    46 }
    47 int main(){
    48     #ifdef LOCAL
    49     freopen("data.in","r",stdin);
    50     freopen("data.out","w",stdout);
    51     #endif
    52     int N,Q;
    53     scanf("%d%d",&N,&Q);
    54     build(1,1,N);
    55     while(Q--){
    56         int x,y;
    57         ax=-INF;ai=INF;
    58         scanf("%d%d",&x,&y);
    59         query(1,x,y);
    60         printf("%d
    ",ax-ai);
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    xen虚拟机管理命令
    ipmi
    http://classworlds.codehaus.org/apiusage.html
    maven编译问题之 -The POM for XXX is invalid, transitive dependencies (if any) will not be available
    SSM项目web.xml等配置文件中如何查找类的全路径名?
    shiro安全框架学习-1
    ht-8 对arrayList中的自定义对象排序( Collections.sort(List<T> list, Comparator<? super T> c))
    ht-7 treeSet特性
    ht-6 hashSet特性
    ht-5 treemap特性
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4896071.html
Copyright © 2020-2023  润新知