HDU 1754 I Hate It:区间树 单点更新

之前做过 区间更新的 所以这个做起来要容易些 算是线段树的水题吧

都是基本操作 直接贴代码

#include<iostream>
#include<cstdio>
#define Size 200000
using namespace std;
struct node
{
        int L, R, Score;
        int Max;
        int Mid()
        {
                return (L+R)/2;
        }
}Tree[Size*3];

void Build( int root, int L, int R )
{
        Tree[root].L = L;
        Tree[root].R = R;
        Tree[root].Max = 0;

        if( L==R )
            return ;
        Build( root*2+1, L, (L+R)/2 );
        Build( root*2+2, (L+R)/2+1, R );
}

void Insert( int root, int i, int a )
{
        if( Tree[root].L == Tree[root].R )
        {
                Tree[root].Score = a;
                Tree[root].Max = a;
                return ;
        }
        Tree[root].Max = max( Tree[root].Max, a );
        if( i<=Tree[root].Mid() )
            Insert( root*2+1, i, a );
        else
            Insert( root*2+2, i, a );
}

int Query( int root, int a, int b )
{
        if( Tree[root].L == a && Tree[root].R == b )
                return Tree[root].Max;

        if( b<=Tree[root].Mid() )
            return Query( root*2+1, a, b );
        else
            if( a>Tree[root].Mid() )
            return Query( root*2+2, a, b );
        else
            return max( Query( root*2+1, a, Tree[root].Mid() ), Query( root*2+2, Tree[root].Mid()+1, b ) );
}

int main()
{
        int N, M, A, B;
        char S[10];
        while( cin>>N>>M )
        {
                Build( 0, 1, N );
                for( int i=1; i<=N; i++ )
                {
                        scanf( "%d", &A );
                        Insert( 0, i, A );
                }
                for( int i=0; i<M; i++ )
                {
                        scanf( "%s%d%d", &S, &A, &B );
                        if( S[0]==‘Q‘ )
                            printf("%d\n",Query( 0, A, B ));
                        else
                             Insert( 0, A, B );
                }
        }
        return 0;
}
时间: 2024-10-11 01:37:51

HDU 1754 I Hate It:区间树 单点更新的相关文章

hdu 1754 I Hate It 线段树单点更新和区间求和

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 参照HH大牛写的额! Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多

HDU 1754 I Hate It 线段树单点更新求最大值

题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 200005 using namespace std; int data[N]; struct Tree { int l,r,ans; }tree[N*4]; void build(in

HDU 1754 I Hate It 线段树(单点更新,成段查询)

题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define lson o<<1 6 #define rson (o<<1)|1 7 #define M l+(r

HDU 1754 I Hate It 线段树 单点更新 区间最大值

1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #

hdu 1754 I Hate It (线段树单点更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1754 照着hdu 1166 的模板稍加改动即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int sum[1000000]; void push(int rt) { sum[rt]=max(sum[rt<<1],s

HDU 1754 I Hate It (线段树单点更新求最大值RMQ)

I Hate It Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束.在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.学生ID编号分别从1

【HDU】1754 I hate it ——线段树 单点更新 区间最值

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

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU - 3074 - Multiply game (线段树-单点更新,区间求积)

题目传送:Multiply game 思路:简单线段树,单点更新,区间求积,这是上次选拔赛选的题,一看题就是线段树,不过当时线段树不太熟,没敢敲,现在看来居然如此轻松,不过注意这里有大量输出,用printf,居然在这里TLE了一次... AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #incl