hdu 1754 I Hate It(单点更新,区段查最值)

题意:

N个成绩。M个操作。

Q a b:查询第a个到第b个成绩中最高成绩

U a b:将第a个成绩改成b

思路:

看代码,,

代码:

const int maxn = 200010;
int maxs[maxn<<2];

int N,M;

void PushUp(int rt){
    maxs[rt] = max( maxs[rt<<1], maxs[rt<<1|1] );
}

void build(int l,int r,int rt){
    if(l==r){
        scanf("%d",&maxs[rt]);
        return;
    }
    int m = (l + r) >> 1;
    build(lson);
    build(rson);
    PushUp(rt);
}

void update(int p,int add,int l,int r,int rt){
    if(l==r){
        maxs[rt] = add;
        return;
    }
    int m = (l + r) >> 1;
    if(p <= m) update(p,add,lson);
    else update(p,add,rson);
    PushUp(rt);
}

int query(int L,int R,int l,int r,int rt){
    if(L<=l && r<=R){
        return maxs[rt];
    }
    int m = (l + r) >> 1;
    int ret = 0;
    if(L <= m) ret = max( ret, query(L,R,lson) );
    if(R > m) ret = max( ret, query(L,R,rson) );
    return ret;
}

int main(){

    while(scanf("%d%d",&N,&M)!=EOF){

        build(1,N,1);

        for(int i=1;i<=M;++i){
            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 if(c == ‘U‘) update(a,b,1,N,1);
        }

    }

}
时间: 2024-10-29 19:05:32

hdu 1754 I Hate It(单点更新,区段查最值)的相关文章

HDU 1754 I Hate It(单点更新,区间求最大值)

题意:n个点m次操作,每次操作给出c,a,b;若c为‘Q’,则查询[a,b]区间最大值:若c为‘U’,将第a个点更新为b; 思路:线段树单点更新,区间求极值: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int tree[5000010]; int a,b,c; void pushup(int pos) { tree[pos]=max(tree[

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 2795 Billboard (线段树单点更新 &amp;&amp; 求区间最值位置)

题意 : 有一块 h * w 的公告板,现在往上面贴 n 张长恒为 1 宽为 wi 的公告,每次贴的地方都是尽量靠左靠上,问你每一张公告将被贴在1~h的哪一行?按照输入顺序给出. 分析 : 这道题说明了每一次贴都尽量选择靠上靠左的位置,那既然这样,我们以1~h建立线段树,给每一个叶子节点赋值初值 w 表示当前行最大能够容纳宽度为 w 的公告纸,那么对于某一输入 wi 只要在线段树的尽量靠左的区间找出能够容纳这张公告的位置(即叶子节点)然后减去 wi 即可,需要对query()函数进行一点改造,将

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): 39163    Accepted Submission(s): 15507 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师

HDU 1166(线段树单点更新)

HDU 1166 题意:1-n个堡垒,人数在不断变化,多次查询 l-r人数和: 思路:线段树的单点更新: #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<algorithm> #include<cmath> #include<map> #include<vector> #include<queu

poj 2763 树链剖分(单点更新,区间求值)

http://poj.org/problem?id=2763 Description After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordinary happy life. People in XX Village lived in beautiful huts. There are some pairs of huts connected by bidirectional ro

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): 70863    Accepted Submission(s): 27424 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的

HDU - 1754 I Hate It (线段树区间求最值)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 题意:线段树的单点更新和区间求最值 模板题,,,???,, 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 5 typedef long long LL; 6 const int N=200010; 7 8 LL ans; 9 LL max(LL a,LL b){ 10 if(a>b) r

HDU 2795 Billboard(线段树,单点更新)

D - Billboard Crawling in process... Crawling failed Time Limit:8000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2795 Appoint description: bupt_admin_13 (2015-07-28) System Crawler (2015-08-18) Description