您的位置:首页 > 其它

HDU 1754 I Hate It!(线段树)

2016-07-25 10:58 393 查看

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1754

题解:

线段树记录一下最大值搞一搞就好了,注意要用scanf输入,同时数据不止一组。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lc (d<<1)
#define rc (d<<1|1)
#define mid ((l+r)>>1)
using namespace std;
int b[200050];
struct node
{
int mx, l, r;
}tr[800000];
void build(int d, int l, int r)
{
tr[d].l = l, tr[d].r = r;
if(l == r)
{
tr[d].mx = b[l];
return ;
}
build(lc, l, mid);
build(rc, mid+1, r);
tr[d].mx = max(tr[lc].mx, tr[rc].mx);
}

int query(int d, int l, int r, int L, int R)
{
if(tr[d].l == L && tr[d].r == R)
{
return tr[d].mx;
}
if(R <= mid)return query(lc,l,mid,L,R);
else if(L > mid)return query(rc,mid+1,r,L,R);
else
return max(query(lc, l, mid,L,mid), query(rc, mid+1, r,mid+1,R));
}

void update(int d, int pos, int k)
{
if(tr[d].l == pos && tr[d].l == tr[d].r)
{
tr[d].mx = k;
return;
}
int midd = (tr[d].r + tr[d].l)/2;
if(pos <= midd)update(lc,pos,k);
else
update(rc,pos,k);
tr[d].mx = max(tr[lc].mx, tr[rc].mx);
}

int main()
{
int n ,m;
while(~scanf("%d%d", &n, &m))
{
char s[2];
int n1,n2;
for(int i = 1; i <= n; i++)
{
int grade;
scanf("%d",&grade);
b[i] = grade;
}
build(1,1,n);
while(m--)
{
scanf("%s", &s);
scanf("%d%d", &n1, &n2);
if(s[0] == 'Q')
cout << query(1,1,n,n1,n2) <<endl;
else
update(1, n1 ,n2);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm