• [线段树] (b) hdu1754 单点修改区间求最大


    (b) hdu1754 I Hate It

    如在阅读本文时遇到不懂的部分,请在评论区询问,或跳转 线段树总介绍

    /*hdu1754 */
    /*多组数据 woc*/
    
    #include<iostream>
    #include<cstdio>
    #include<stdio.h>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define mid (t[rt].l+t[rt].r>>1)
    #define ls (rt<<1)
    #define rs (ls|1)
    #define mid (t[rt].l+t[rt].r>>1)
    #define pushup(rt) t[rt].mx=max(t[ls].mx,t[rs].mx)
    /*
    N M
    student : 1 - N
          (1 - M)
    one for Q/U A B
    Q : Max of [A,B]
    U : A -> B
    */
    const int N=2e6+2;
    struct node{int l,r,mx;}t[N<<2];
    int a[N],n,m;
    void build(int rt,int l,int r){
        t[rt].l=l,t[rt].r=r,t[rt].mx=0;
        if(l==r){t[rt].mx=a[l];return;}
        build(ls,l,mid);build(rs,mid+1,r);
        pushup(rt);
    }
    void update(int rt,int x,int delta){
        if(x==t[rt].l&&x==t[rt].r){t[rt].mx=delta;return;}
        if(x<=mid)update(ls,x,delta);
        else update(rs,x,delta);
        pushup(rt);return;
    }
    int query(int rt,int x,int y){
        if(t[rt].l>=x&&t[rt].r<=y)return t[rt].mx;
        int res=-0x7fffffff;
        if(x<=mid)res=max(res,query(ls,x,y));
        if(y>mid)res=max(res,query(rs,x,y));
        return res;
    }
    int main()
    {
        //freopen("b.in","r",stdin);
        //freopen("b.out","w",stdout);
        while(scanf("%d%d",&n,&m)!=EOF){
            for(int i=1;i<=n;++i) scanf("%d",&a[i]);
            register char ch;
            register int x,y;
            build(1,1,n);
            while(m--){
                cin>>ws;
                scanf("%c%d%d",&ch,&x,&y);
                if(ch=='Q')printf("%d
    ",query(1,x,y));
                else update(1,x,y);
            }
        }
        return 0;
    }
  • 相关阅读:
    权限设计 【数据库和代码】 GO
    sql读取指定字符前的字符 GO
    C#编码建议 GO
    网页鼠标提示 GO
    ASP.NET设置ie打印两法 GO
    正则表达式入门教程 GO
    一个初学者对ArrayAdapter的简单理解
    泛型的简单理解
    SQL Server死锁详解
    .NET代理模式
  • 原文地址:https://www.cnblogs.com/lsy263/p/11227850.html
Copyright © 2020-2023  润新知