HDU 1754 线段树
2016-08-17 20:09
274 查看
又是一题自己轻松AK的,很开心啊,记录一下,这个题比前面稍微复杂的就是多了一个max值的指标,这个其实只要在结构体里加上就好了,然后写的build和update和query的时候稍加max注意一下 就能轻松求出来了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mid int m = (l + r)>>1
const int maxn=200010;
int n,m,a,b;
int num[maxn];
char s[5];
struct node
{
int l,r,sum,maxs;
}t[maxn<<2];
void build(int l,int r,int rt)
{
t[rt].l=l;
t[rt].r=r;
t[rt].sum=0;
if(l==r)
{
t[rt].sum=num[l];
t[rt].maxs=num[l];
return ;
}
mid;
build(lson);
build(rson);
t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
t[rt].maxs=max(t[rt<<1].maxs,t[rt<<1|1].maxs);
}
void update(int l,int r,int rt,int x,int y)
{
if(l==r)
{
t[rt].sum=y;
t[rt].maxs=y;
return ;
}
mid;
if(x<=m) update(lson,x,y);
else
update(rson,x,y);
t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
t[rt].maxs=max(t[rt<<1].maxs,t[rt<<1|1].maxs);
}
int query(int l,int r,int rt,int x,int y)
{
if(x<=l&&y>=r)
return t[rt].maxs;
mid;
int mm=-1;
if(x<=m)
mm=max(mm,query(lson,x,y));
if(y>m)
mm=max(mm,query(rson,x,y));
return mm;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
build(1,n,1);
while(m--)
{
scanf("%s",s);
scanf("%d%d",&a,&b);
if(s[0]=='U')
{
update(1,n,1,a,b);
}
else if(s[0]=='Q')
{
printf("%d\n",query(1,n,1,a,b));
}
}
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mid int m = (l + r)>>1
const int maxn=200010;
int n,m,a,b;
int num[maxn];
char s[5];
struct node
{
int l,r,sum,maxs;
}t[maxn<<2];
void build(int l,int r,int rt)
{
t[rt].l=l;
t[rt].r=r;
t[rt].sum=0;
if(l==r)
{
t[rt].sum=num[l];
t[rt].maxs=num[l];
return ;
}
mid;
build(lson);
build(rson);
t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
t[rt].maxs=max(t[rt<<1].maxs,t[rt<<1|1].maxs);
}
void update(int l,int r,int rt,int x,int y)
{
if(l==r)
{
t[rt].sum=y;
t[rt].maxs=y;
return ;
}
mid;
if(x<=m) update(lson,x,y);
else
update(rson,x,y);
t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
t[rt].maxs=max(t[rt<<1].maxs,t[rt<<1|1].maxs);
}
int query(int l,int r,int rt,int x,int y)
{
if(x<=l&&y>=r)
return t[rt].maxs;
mid;
int mm=-1;
if(x<=m)
mm=max(mm,query(lson,x,y));
if(y>m)
mm=max(mm,query(rson,x,y));
return mm;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
build(1,n,1);
while(m--)
{
scanf("%s",s);
scanf("%d%d",&a,&b);
if(s[0]=='U')
{
update(1,n,1,a,b);
}
else if(s[0]=='Q')
{
printf("%d\n",query(1,n,1,a,b));
}
}
}
return 0;
}
相关文章推荐
- 有哪些编程必备的 Vim 配置?
- session.get()方法中的参数的含义
- codevs 1689 搭建高塔
- 让Java Thread线程暂停的三种方式
- 如何使得向下还原按钮失效?
- STL vector中的front方法(4)
- JSP详解--EL表达式
- 关于Activity和Fragment生命周期的小记录
- 所需即所获:像 IDE 一样使用 vim
- 公众号与App哪个更有前景
- 制作二维码
- 【九度1502】最大值最小化
- Oracle EBS 模拟登入
- 贪心算法之活动选择理解
- Codeforces Round #332 (Div. 2)
- FZU 1021 飞船赛
- 在VMware下,不能打开虚拟机,提示错误为:无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件
- 实际项目中数据结构的选择
- 移动端rem单位用法
- 【JZOJ4709】Matrix