B - I Hate It HDU 1754 线段树

B - I Hate It

Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 1754

Description

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。

这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

Input

本题目包含多组测试,请处理到文件结束。

在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。

学生ID编号分别从1编到N。

第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。

接下来有M行。每一行有一个字符 C (只取‘Q‘或‘U‘) ,和两个正整数A,B。

当C为‘Q‘的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。

当C为‘U‘的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

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

//线段树 的基础题,单点更新,区间的最大值

#include<bits/stdc++.h>
using namespace std;
const int maxn=200011;
const int inf=999999999;
#define lson (rt<<1),L,M
#define rson (rt<<1|1),M+1,R
#define M ((L+R)>>1)
#define For(i,n) for(int i=0;i<(n);i++)
template<class T>inline T read(T&x)
{
    char c;
    while((c=getchar())<=32);
    bool ok=false;
    if(c=='-')ok=true,c=getchar();
    for(x=0; c>32; c=getchar())
        x=x*10+c-'0';
    if(ok)x=-x;
    return x;
}
template<class T> inline void read_(T&x,T&y)
{
    read(x);
    read(y);
}
template<class T> inline void write(T x)
{
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else write(x/10),putchar(x%10+'0');
}
template<class T>inline void writeln(T x)
{
    write(x);
    putchar('\n');
}
//-------IO template------

struct node
{
    int maxv;
    node(){maxv=0;}
}p[maxn<<2];

int n;
void build(int rt,int L,int R,int cnt)
{
    if(cnt>=n)return;
    if(L==R)
    {
        read(p[rt].maxv);
        return ;
    }
    build(lson,cnt+1);
    build(rson,cnt+1);
    p[rt].maxv=max(p[rt<<1].maxv,p[rt<<1|1].maxv);
}
void update(int rt,int L,int R,int i,int v)
{
    if(L==R)
    {
        p[rt].maxv=v;return ;
    }
    if(i<=M)
        update(lson,i,v);
    else
        update(rson,i,v);
    p[rt].maxv=max(p[rt<<1].maxv,p[rt<<1|1].maxv);
}

int query(int rt,int L,int R,int x,int y)
{
  //  printf("%d %d %d %d %d\n",rt,L,R,x,y);
    if(L==x&&y==R)
    {
        return p[rt].maxv;
    }
    if(y<=M)
        return query(lson,x,y);
    else if(x>M)
        return query(rson,x,y);
    else
        return max(query(lson,x,M),query(rson,M+1,y));
}

int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
    int m,i,j,k,t;
    while(~scanf("%d%d",&n,&m))
    {
        build(1,1,n,1);
        char op[2];
        //cout<<m<<endl;
        while(m--)
        {
            scanf("%s",op);
            int x,y;read_(x,y);
          //  printf("%s  %d %d\n",op,x,y);
            if(op[0]=='Q')
            {
                writeln(query(1,1,n,x,y));
            }
            else if(op[0]=='U')
            {
                update(1,1,n,x,y);
            }
        }
    }
    return 0;
}

时间: 2024-11-14 14:45:26

B - I Hate It HDU 1754 线段树的相关文章

HDU(1754),线段树,单点替换,区间最值

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include <stdio.h> #include <algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn = 200010; int MAX

HDU 1754线段树基本操作,建树,更新,查询

代码线段树入门整理中有介绍. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXNODE=1<<19; 7 const int MAX=1000003; 8 struct NODE{ 9 int left,right; 10 int value; 11 }node[

hdu 1754 线段树 水题 单点更新 区间查询

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 59558    Accepted Submission(s): 23201 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

hdu 1754 线段树 单点更新 动态区间最大值

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 52417    Accepted Submission(s): 20598 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的

B - I Hate It HDU - 1754 线段树区间最大值板子(单点更新,区间最大)

第一次打 改了半天  各种小错误 难受 1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 const int maxn=2000000+7; 5 int a[maxn],n; 6 struct Node{ 7 int l,r; 8 long long Max,lazy; 9 void update(long long val){ 10 ;//本题没用 11 } 12 }tree[maxn*5]; 13

I Hate It HDU - 1754 (线段树)

注意点:scanf中使用%c时,会读取空格和回车,所以在%c之前要有一个空格 ( 或者直接使用%s也行,%s会忽略空格和回车 ).具体见下面的代码: 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cmath> 5 #include<set> 6 #include<algorithm> 7 #include<cstdio> 8 #i

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

HDU 4902 线段树(区间更新)

Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 353    Accepted Submission(s): 169 Problem Description There is an old country and the king fell in love with a devil. The devil alw

hdu 4893 线段树 --- 也是两个变 类似双标记

http://acm.hdu.edu.cn/showproblem.php?pid=4893 开始的时候,我按双标记,WA了一下午,搞不定,我是用的两个标记add--表示当前结点中有值发生变化,flag,斐波那契的懒惰标记,但是估计是我自己处理的有问题,一直不对 参考了别人的代码,写法还是很不错的,Add变量维护的是,完全变成Fibonacci的时候的和,---回头我再重新写一遍 #include <cstdio> #include <cstring> #include <a