HDU_1754 I Hate It (线段树)

  线段树题目,每一段存这一段的最大值。查询时直接匹配线段,找出最大值就行,更新有点小操作要注意。

结构体

struct node
{
int l, r;
int max;
}node[N
*4];

两数取较大的:

int Max(int a, int b)
{
return a > b ? a : b;
}

建树

void creat(int t, int l, int r)
{
node[t].l
= l;
node[t].r
= r;
if(l == r)
{
node[t].max
= stu[l];   //用一个stu[]存储N个学生的初始成绩, 方便在建树时使用
return ;
}
int mid = (r + l) >> 1;
creat(t
<< 1, l, mid);
creat(t
<< 1|1, mid + 1, r);
node[t].max
= Max(node[t<<1].max, node[t<<1|1].max);
}

更新:

void updata(int t, int x, int y)
{
if(node[t].l ==x && x == node[t].r)
{
node[t].max
= y;
return ;
}
int mid = (node[t].l + node[t].r) >> 1;
if(x <= mid)
updata(t
<< 1, x, y);
else
updata(t
<< 1|1, x, y);
node[t].max
= Max(node[t<<1].max, node[t<<1|1].max);

}

查询:

void query(int t, int l, int r)
{
if(node[t].l == l && node[t].r == r)
{
if(ans <= node[t].max)
ans
= node[t].max;
return;
}
int mid = (node[t].l + node[t].r) >> 1;
if(l > mid)
query(t
<<1|1, l, r);
else if(r <= mid)
query(t
<<1, l, r);
else
{
query(t
<<1, l, mid);
query(t
<<1|1, mid+1, r);
}
}

另外一种写法,今天复习线段树重新做了一遍这题,正值中午十分,昏昏欲睡,迷迷糊糊的写这了这段代码。。。

#include <iostream>
#include
<cstdio>
#include
<cstring>
#define L(t) t<<1
#define R(t) t<<1|1

using namespace std;

const int N = 200005;

struct node
{
int l, r;
int max;
}node[N
*3];

int num[N];

int Max(int a, int b)
{
return a > b ? a : b;
}
void creat(int t, int l, int r)
{
node[t].l
= l;
node[t].r
= r;
if(l == r)
{
node[t].max
= num[l];
return;
}
int mid = (l + r) >> 1;
creat(L(t), l, mid);
creat(R(t), mid
+1, r);
node[t].max
= Max(node[L(t)].max, node[R(t)].max);
}

void updata(int t, int x, int val)
{
node[t].max
= Max(node[t].max, val);

if(node[t].l == x && node[t].r == x)
{
node[t].max
= val;
return ;
}
int mid = (node[t].l + node[t].r) >> 1;
if(x <= mid)
updata(L(t), x, val);
else
updata(R(t), x, val);
}

int query(int t, int l, int r)
{
if(node[t].l == l && node[t].r == r)
return node[t].max;
int mid = (node[t].l + node[t].r) >> 1;
if(l > mid)
return query(R(t), l, r);
else if(r <= mid)
return query(L(t), l, r);
else
return Max(query(L(t), l, mid), query(R(t), mid+1, r));
}

int main()
{
//freopen("data.in", "r", stdin);

int n, m, i, x, y;
char s[2];
while(~scanf("%d%d", &n, &m))
{
for(i = 1; i <= n; i++)
scanf(
"%d", &num[i]);
creat(
1, 1, n);
while(m--)
{
scanf(
"%s%d%d", s, &x, &y);
if(s[0] == 'U')
updata(
1, x, y);
else
printf(
"%d\n", query(1, x, y));
}
}
return 0;
}

posted @ 2011-08-14 14:47  AC_Von  阅读(252)  评论(0编辑  收藏  举报