您的位置:首页 > 编程语言 > C语言/C++

HDU 1754

2015-07-13 17:58 405 查看
线段树,求区间的最值,更新单点的值。

比较坑的是:

首先忘记了max的头文件,导致一直CE,

再次读字符前忘记吃掉空格,但是不知道为什么一直TE,文件读不到结尾,O__O"…。 板刷TLE, orz。

AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxx 200010
int sco[maxx<<2];
int n,k;
void find_max(int rt)
{
sco[rt]=max(sco[rt<<1],sco[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&sco[rt]);
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
find_max(rt);
}

void change(int p,int ch,int l,int r,int rt)
{
if(l==r)
{
sco[rt]=ch;
return;
}
int m=(l+r)>>1;
if(p<=m)
change(p,ch,lson);
else
change(p,ch,rson);

find_max(rt);
}
int query(int left,int right,int l,int r,int rt)
{
if(left<=l&&right>=r)
return sco[rt];

int m=(l+r)>>1;
int ans=0;
if(left<=m)
{
ans=max(ans,query(left,right,lson));
}
if(right>m)
{
ans=max(ans,query(left,right,rson));
}
return ans;
}
int main()
{
int n,m;
while (~scanf("%d%d",&n,&m)) {
build(1 , n , 1);
while (m --)
{
char c;
int a , b;
getchar();
scanf("%c%d%d",&c,&a,&b);
if (c== 'Q') printf("%d\n",query(a , b , 1 , n , 1));
else change(a , b , 1 , n ,  1);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM C++ HDU