现在的位置: 首页 > 综合 > 正文

hdoj 1754 I Hate It(线段树)

2019年04月02日 ⁄ 综合 ⁄ 共 1321字 ⁄ 字号 评论关闭
第一道自己写的线段树的题,虽然很简单但也留个记念吧

#include <stdio.h>
#define M 200005

struct data{
    int
l,r,max;
}line[3*M];
int num[M];
int max(int a,int b)
{
    return a
> b?a:b;
}
void buildtree(int left,int right,int
u)   //建树
{
    line[u].l =
left;
    line[u].r =
right;
    if (left ==
right)
       
line[u].max = num[left];
    else
    {
       
buildtree(left,(left+right)/2,2*u);
       
buildtree((left+right)/2+1,right,2*u+1);
       
line[u].max = max(line[2*u].max,line[2*u+1].max);
    }
}

void updata (int a,int b,int
u)   
//更新数据
{
    if
(line[u].l == line[u].r)
       
line[u].max = b;
    else
    {
       
if (a <= line[2*u].r)
           
updata (a,b,2*u);
       
if (a >= line[2*u+1].l)
           
updata(a,b,2*u+1);
       
line[u].max = max(line[2*u].max,line[2*u+1].max);
    }
}

int query (int left,int right,int
u)   //查询
{
    if
(line[u].l == left&&line[u].r ==
right)
       
return line[u].max;
    if (right
<= (line[u].l+line[u].r)/2)
       
return query(left,right,2*u);
    if (left
>= (line[u].l+line[u].r)/2+1)
       
return query (left,right,2*u+1);
    else
       
return max
(query(left,(line[u].l+line[u].r)/2,2*u),query((line[u].l+line[u].r)/2+1,right,2*u+1));

}
int main ()
{
    int
n,m,i,a,b;
    char
c;
    while
(~scanf ("%d%d",&n,&m))
    {
       
for (i = 1;i <= n;i ++)
           
scanf ("%d",&num[i]);
       
buildtree(1,n,1);
       
while (m --)
       
{

           
getchar ();  
//这里要注意多加个getchar()
           
scanf ("%c %d
%d",&c,&a,&b);

           
if (c == 'Q')
  

抱歉!评论已关闭.