zoukankan      html  css  js  c++  java
  • poj 3264(线段树)

    http://poj.org/problem?id=3264

    初学线段可以做的水题,也是线段树的基础运用。也是我的第一个线段树的题。

    题意:在区间范围内的最大值减去最小值

    思路:线段树记录下每个区间内的最大值以及最小值,然后查询。

    我也是第一次做,然后耗时比较多。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 500500
     4 
     5 int max(int x,int y)
     6 {
     7     return x > y? x : y ;
     8 }
     9 int min(int x,int y)
    10 {
    11     return x > y? y : x;
    12 }
    13 
    14 struct note{
    15 
    16     int Min,Max;
    17 
    18 }segtree[ maxn * 2];
    19 
    20 int arra[ maxn ];
    21 
    22 
    23 void build(int root , int arr[] , int instart , int iend)
    24 {
    25     if(instart == iend)
    26     {
    27       //  segtree[ root ].val = arr[ instart ];
    28         segtree[ root ].Max = arr[ instart ];
    29         segtree[ root ].Min = arr[ instart ];
    30     }
    31     else
    32     {
    33         int mid = (instart+iend)/2;
    34         build( root * 2 , arr , instart , mid );
    35         build( root * 2 + 1 , arr , mid + 1 , iend );
    36         segtree[ root ].Max = max(segtree[ root * 2 ].Max,segtree[ root * 2 + 1 ].Max);
    37         segtree[ root ].Min = min(segtree[ root * 2 ].Min,segtree[ root * 2 + 1 ].Min);
    38     }
    39 }
    40 
    41 int remin(int root ,int nstart , int nend , int qstart , int qend)
    42 {
    43     if(qstart > nend || qend < nstart)
    44         return maxn*10;
    45     if( qstart <= nstart && qend >= nend )
    46         return segtree[ root ].Min;
    47     int mid =( nstart + nend ) / 2;
    48     return min(remin(root * 2,nstart,mid,qstart,qend),
    49                remin(root * 2 + 1 , mid + 1 , nend , qstart , qend ));
    50 }
    51 int reMax(int root , int nstart , int nend , int qstart , int qend)
    52 {
    53     if(qstart > nend || qend < nstart)
    54         return 0;
    55     if(qstart <= nstart && qend >= nend )
    56         return segtree [ root ].Max;
    57     int mid = ( nstart + nend ) / 2;
    58     return max(reMax(root * 2, nstart , mid , qstart , qend ),
    59                reMax(root * 2 + 1 , mid + 1 , nend , qstart , qend ) );
    60 }
    61 
    62 int main()
    63 {
    64   //  freopen("in.txt","r",stdin);
    65     int m,n,a,b,ma,mi;
    66     scanf("%d%d",&m,&n);
    67     for( int i = 1 ; i <= m ; i++ )
    68         scanf("%d",&arra[ i ]);
    69     build(1,arra,1,m);
    70     while(n--)
    71     {
    72         scanf("%d%d",&a,&b);
    73         ma = reMax(1,1,m,a,b);
    74         mi = remin(1,1,m,a,b);
    75         printf("%d
    ",ma-mi);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    MySql入门知识(一)
    一起学Android之Handler
    一起学Android之Http访问
    一起学Android之Sqlite
    一起学Android之Storage
    iOS核心动画高级技巧-1
    iOS界面流畅技巧之微博 Demo 性能优化技巧
    IOS 企业版证书($299)In-House方式发布指南
    App Store生存指南
    企业证书发布APP
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5755900.html
Copyright © 2011-2022 走看看