码迷,mamicode.com
首页 > 其他好文 > 详细

解题报告:poj 3264 最基本的线段树

时间:2017-10-07 18:45:29      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:blog   线段树   mes   线段   记录   ++   att   iostream   false   

2017-10-07 17:54:55

writer:pprp

/*
@theme: 最基本的线段树
@writer:pprp
@end:17:38
@attention:记录的数组应该从1开始,不能从0开始
*/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 2000000+50;
const int INF = 0x3f3f3f3f;

struct tree
{
    int nmax,nmin;
    int r,l;
};
tree tt[maxn*3];
int nMax,nMin;

int a[maxn];
void build(int l, int r, int i)
{
    tt[i].l = l;
    tt[i].r = r;
    if(l == r)
    {
        tt[i].nmin = tt[i].nmax = a[l];
        return;
    }
    int mid = (l+r)>>1;
    build(l,mid,2*i);
    build(mid+1,r,2*i+1);
    tt[i].nmin = min(tt[i<<1].nmin,tt[i<<1|1].nmin);
    tt[i].nmax = max(tt[i<<1].nmax,tt[i<<1|1].nmax);
}
void query(int i, int l, int r)
{
    if(tt[i].nmax <= nMax && tt[i].nmin >= nMin)
        return ;
    if(tt[i].l == l && tt[i].r == r)
    {
        nMax = max(tt[i].nmax,nMax);
        nMin = min(tt[i].nmin,nMin);
        return;
    }
    int mid = (tt[i].l+tt[i].r) >> 1;
    if(r <= mid)
        query(i<<1,l,r);
    else if(l > mid)
        query(i<<1|1,l,r);
    else
    {
        query(i<<1,l,mid);
        query(i<<1|1,mid+1,r);
    }
}

int main()
{
//    freopen("in.txt","r",stdin);
    cin.sync_with_stdio(false);
    int n, q;
    int l, r;
    while(cin >> n >> q)
    {
        for(int i = 1 ; i <= n ; i++)
        {
            cin>>a[i];
        }
        build(1,n,1);
        for(int i = 1; i <= q; i++)
        {
            cin >> l >> r;
            nMax = -INF,nMin = INF;
            query(1,l,r);

            cout << nMax-nMin << endl;
        }
    }

    return 0;
}

 

解题报告:poj 3264 最基本的线段树

标签:blog   线段树   mes   线段   记录   ++   att   iostream   false   

原文地址:http://www.cnblogs.com/pprp/p/7635333.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!