zoukankan      html  css  js  c++  java
  • poj 3264Balanced Lineup解题报告

    poj 3264-Balanced Lineup链接:http://poj.org/problem?id=3264

    题意说明:有n个数,要求随时统计一定区间上最大值和最小值的差

    从题意也能看出来是线段树的问题,节点在建立的时候包括区间的最大值与最小值。

    View Code
      1 #include<iostream>
    2 #include<stdio.h>
    3 #include<string.h>
    4 using namespace std;
    5 #define N 400005
    6 int min(int a,int b)
    7 {
    8 return a<b?a:b;
    9 }
    10 int max(int a,int b)
    11 {
    12 return a>b?a:b;
    13 }
    14 struct node
    15 {
    16 int l,r;
    17 int min,max;
    18 int data;
    19 int mid;
    20 }tree[N];
    21
    22 void bulid(int l,int r,int id)
    23 {
    24 tree[id].l=l;
    25 tree[id].r=r;
    26 tree[id].max=INT_MAX;
    27 tree[id].min=INT_MIN;
    28 tree[id].data=0;
    29 tree[id].mid=(l+r)>>1;
    30 if(l==r)
    31 return;
    32 bulid(l,tree[id].mid,id<<1);
    33 bulid(tree[id].mid+1,r,id<<1|1);
    34 }
    35 void insert(int l,int r,int data,int id)
    36 {
    37 if(tree[id].l==l&&tree[id].r==r)
    38 {
    39 tree[id].data=data;
    40 tree[id].max=data;
    41 tree[id].min=data;
    42 return;
    43 }
    44 if(r<=tree[id].mid)
    45 {
    46 insert(l,r,data,id<<1);
    47 }
    48 else if(l>tree[id].mid)
    49 {
    50 insert(l,r,data,id<<1|1);
    51 }
    52 else
    53 {
    54 insert(l,tree[id].mid,data,id<<1);
    55 insert(tree[id].mid+1,r,data,id<<1|1);
    56 }
    57 tree[id].min=min(tree[id<<1].min,tree[id<<1|1].min);
    58 tree[id].max=max(tree[id<<1].max,tree[id<<1|1].max);
    59 }
    60 int findmin(int l,int r,int id)
    61 {
    62 if(tree[id].l==l&&tree[id].r==r)
    63 return tree[id].min;
    64 int a=INT_MAX;
    65 int b=INT_MAX;
    66 if(r<=tree[id].mid)
    67 a=findmin(l,r,id<<1);
    68 else if(l>tree[id].mid)
    69 b=findmin(l,r,id<<1|1);
    70 else
    71 {
    72 a=findmin(l,tree[id].mid,id<<1);
    73 b=findmin(tree[id].mid+1,r,id<<1|1);
    74 }
    75 return min(a,b);
    76 }
    77 int findmax(int l,int r,int id)
    78 {
    79 if(tree[id].l==l&&tree[id].r==r)
    80 return tree[id].max;
    81 int a=INT_MIN;
    82 int b=INT_MIN;
    83 if(r<=tree[id].mid)
    84 a=findmax(l,r,id<<1);
    85 else if(l>tree[id].mid)
    86 b=findmax(l,r,id<<1|1);
    87 else
    88 {
    89 a=findmax(l,tree[id].mid,id<<1);
    90 b=findmax(tree[id].mid+1,r,id<<1|1);
    91 }
    92 return max(a,b);
    93 }
    94 int main()
    95 {
    96 int n,m;
    97 int i;
    98 int s,e;
    99 while(scanf("%d%d",&n,&m)!=EOF)
    100 {
    101 bulid(1,n,1);
    102 for(i=1;i<=n;i++)
    103 {
    104 scanf("%d",&s);
    105 insert(i,i,s,1);
    106 }
    107 for(i=0;i<m;i++)
    108 {
    109 scanf("%d%d",&s,&e);
    110 if(s>e)
    111 {
    112 s^=e;
    113 e^=s;
    114 s^=e;
    115 }
    116 int a=findmax(s,e,1);
    117 int b=findmin(s,e,1);
    118 printf("%d\n",a-b);
    119 }
    120 }
    121 return 0;
    122 }
  • 相关阅读:
    POJ 3140 Contestants Division (树形DP,简单)
    POJ 2378 Tree Cutting (树的重心,微变形)
    js数据类型--对象&数组
    关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
    JS模块化编程(四)--require应用
    JS模块化编程(三)
    利用VS正则替换删除文本行首数据等字符
    JS模块化编程(二)
    JS模块化编程(一)
    js继承
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2433638.html
Copyright © 2011-2022 走看看