poj3264 线段树水题

本文通过一次青岛市的比赛经历,分享了一道使用线段树解决最值问题的实战案例。文章详细介绍了线段树的构建、插入及搜索过程,并附上了完整的C++实现代码。

之前青岛市的一个比赛有题线段树,结果自己实在太二,用线段树去敲没想到自己哪儿错了。。。

结果今天回来一做一道求最值的水题就发现自己的错误了。。。。导致那场比赛呗虐啊。。。。

 

#include<iostream>
#include<cstdio>
using namespace std;
const int inf =1<<30;
struct segtree
{
    int l;
    int r;
    int mid;
    int max;
   // int sum;
    int min;
}T[600011];


int max(int a,int b)
{
    return a>b?a:b;
}
int min(int a,int b)
{
    return a<b?a:b;
}


void construct(int l,int r,int k)  //二叉树
{
    T[k].l=l;
    T[k].r=r;
    T[k].mid=(l+r)/2;
    T[k].max=-1;
    T[k].min=inf;
    //T[k].sum=0;


    if(l==r)    return ;

    construct(l,T[k].mid,2*k);
    construct(T[k].mid+1,r,2*k+1);
}


void insert(int n,int d,int k)
{
    if(T[k].l==T[k].r&&T[k].l==d)   {T[k].max=n;T[k].min=n;return ;}
    //if(T[k].l==T[k].r&&T[k].l==d)   {T[k].sum+=n;return ;}

    if(d<=T[k].mid)  insert(n,d,2*k);
    else            insert(n,d,2*k+1);
    {
        T[k].max=max(T[2*k].max,T[2*k+1].max);
        T[k].min=min(T[2*k].min,T[2*k+1].min);
    }
}


int ans;int ans1;
void search(int l,int r,int k)              //类似深搜
{
    if(T[k].l==l&&T[k].r==r)    {ans=max(ans,T[k].max);ans1=min(ans1,T[k].min);return ;}
    //if(T[k].l==l&&T[k].r==r)    {ans+=T[k].sum;return ;}

    if(r<=T[k].mid)      search(l,r,2*k);
    else if(l>T[k].mid)  search(l,r,2*k+1);
    else
    {
        search(l,T[k].mid,2*k);
        search(T[k].mid+1,r,2*k+1);
    }
}


int main()
{
    int N,Q;
    cin>>N>>Q;
    construct(1,N,1);
    for(int i=1;i<=N;i++)
    {
        int v;
        scanf("%d",&v);
        insert(v,i,1);
    }
    while(Q--)
    {
        int v,w;
        ans=-1;ans1=inf;
        scanf("%d%d",&v,&w);
        search(v,w,1);
        cout<<ans-ans1<<endl;
    }
    return 0;
}


 

转载于:https://www.cnblogs.com/amourjun/archive/2013/05/28/5134148.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值