HDU-1754 I Hate It
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 102384 Accepted Submission(s): 38495
Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
Output
对于每一次询问操作,在一行里面输出最高成绩。
Sample Input
5 6
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 2 9
Q 1 5
Sample Output
5
6
5
9
Hint
Huge input,the C function scanf() will work better than cin
基本线段树模板1,只包含单点修改和区间询问
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define MAXL 200005
struct node{int l,r,maxnum;}tree[MAXL<<2];
int n,m,ori[MAXL];
void build(int k,int l,int r)//建树
{
tree[k].l=l;tree[k].r=r;
if(l==r)
{
tree[k].maxnum=ori[l];
return;
}
int mid=(l+r)/2;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tree[k].maxnum=max(tree[k<<1].maxnum,tree[k<<1|1].maxnum);
}
int ques(int k,int l,int r)//查询
{
if(l==tree[k].l&&r==tree[k].r)
{
return tree[k].maxnum;
}
int mid=(tree[k].l+tree[k].r)/2;
if(l>mid) return ques( k<<1|1,l,r);
else if(r<=mid) return ques(k<<1,l,r);
else return max(ques(k<<1,l,mid),ques( k<<1|1,mid+1,r));
}
void change(int k,int a,int b)//改变
{
if(tree[k].l==tree[k].r&&tree[k].l==a)
{
tree[k].maxnum=b;
return ;
}
int mid=(tree[k].l+tree[k].r)>>1;
if(a>mid) change(k<<1|1,a,b);
else change(k<<1,a,b);
tree[k].maxnum=max(tree[k<<1].maxnum,tree[k<<1|1].maxnum);
return;
}
int main(void)
{
while(~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&ori[i]);
}
build(1,1,n);
char order[2];
int a,b;
for(int i=0;i<m;i++)
{
scanf("%s%d%d",order,&a,&b);
if(order[0]=='Q')
printf("%d\n",ques(0,a,b));
else change(0,a,b);
}
}
return 0;
}