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 }
  • 相关阅读:
    常见 Web 安全攻防总结
    传统方式接口测试返回值json验证
    Springboot中RestTemplate -- 用更优雅的方式发HTTP请求
    mock简单的json返回
    MySQL数据库学习笔记(五)----MySQL字符串函数、日期时间函数
    MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)
    MySQL数据库学习笔记(三)----基本的SQL语句
    MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
    python实现广度优先搜索
    php递归
  • 原文地址:https://www.cnblogs.com/caozhenhai/p/2433638.html
Copyright © 2011-2022 走看看