线段树内容详解

来源:互联网 发布:大数据融合技术 kettle 编辑:程序博客网 时间:2024/06/08 05:14

hdu I hate it

|               0              
|           1       ||          2          
|   3      ||  4   ||   5     ||   6
| 7 || 8   || 9 || 10 ||11||12||13||14||15|

线段树的结构无非就是这样子的。

存如数据的时候,从n-1个位置开始存,以样例来说明的话,数字1会存在dat[5]的位置,2存在dat[6],3存在7,4存在8...

注意输入的时候getchar()一下。

#include<stdio.h>#include<iostream>using namespace std;const int maxn = 200005*2;//const int INT_MAX = -1<<31;int n,dat[2*maxn-1];void init(int n_)//把所有数都初始化为INT_MAX{    n = 1;    while(n<n_)n*=2;    for(int i = 0 ;i < 2*n-1;i++)        dat[i]= INT_MIN;}void update(int k,int a){    k += n-1;    dat[k] = a;    while(k>0)    {        k = (k-1)/2;        dat[k]=max(dat[k*2+1],dat[k*2+2]);    }}int query(int a, int b,int k,int l ,int r)//查询用 query(a,b,0,0,n)·查询[a,b){    if(r<=a||b<=l){return INT_MIN;}    if(a<=l&&r<=b)return dat[k];    else    {        int vl = query(a,b,k*2+1,l,(l+r)/2);        int vr = query(a,b,k*2+2,(l+r)/2,r);        return max(vl,vr);    }}int main(){    int m,a;    char op;    while(~scanf("%d%d",&n,&m))    {    //    cout<<n<<" "<<m<<endl;        init(n);        //build(0,n-1,0)        for(int i = 0 ; i < n; i++)        {            scanf("%d",&a);            update(i,a);        }        for(int i = 0 ; i < m ; i++)        {            int op1,op2;            scanf("%c %d %d",&op,&op1,&op2);            getchar();            if(op=='U')            {                update(op1-1,op2);            }            else if(op=='Q')            {                printf("%d\n",query(op1-1,op2,0,0,n));                //cout<<query(op1-1,op2+1,0,0,n)<<endl;            }        }    }    return 0;}




0 0
原创粉丝点击