• hdu 1754 I Hate It 线段树-区间最值


    #include<bits/stdc++.h>
    using namespace std;
    
    typedef int ll;
    const int N=200000+5;
    int a[N],ans;
    
    struct Tree
    {
        int left,right;
        ll maxv;
    }tree[4*N+10];
    
    //建立线段树,如果是数组a1-an,可以build(1,1,n)来建立
    void build(int id,int l,int r)
    {
        tree[id].left=l;
        tree[id].right=r;
        tree[id].maxv=0;
        if (l==r)
        {
            tree[id].maxv=a[l];
        }
        else
        {
            int mid=(l+r)/2;
            build(id*2,l,mid);
            build(id*2+1,mid+1,r);
            tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);
            tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);
        }
    }
    
    //单点更新,id从1开始,pos为目标位置
    void update(int id,int pos,ll val)
    {
        if (tree[id].left==tree[id].right)
            tree[id].maxv=val;
        else
        {
            tree[id].maxv=(val,tree[id].maxv);
            int mid=(tree[id].left+tree[id].right)/2;
            if (pos<=mid) update(id*2,pos,val);
            else update(id*2+1,pos,val);
            tree[id].maxv=max(tree[id*2].maxv,tree[id].maxv);
            tree[id].maxv=max(tree[id*2+1].maxv,tree[id].maxv);
        }
    }
    
    //查询范围内的和
    void query(int id,int l,int r)
    {
        if (tree[id].left==l&&tree[id].right==r)
        {
            ans=max(tree[id].maxv,ans);
            return;
        }
        else
        {
            int mid=(tree[id].left+tree[id].right)/2;
            if (r<=mid) query(id*2,l,r);
            else if (l>mid) query(id*2+1,l,r);
            else
            {
                query(id*2,l,mid);
                query(id*2+1,mid+1,r);
            }
        }
    }
    
    int main()
    {
        int i,n,m,x,y;
        char cmd[20];
        while(~scanf("%d%d",&n,&m))
        {
            memset(a,0,sizeof(a));
    
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            build(1,1,n);
            for(i=0;i<m;i++)
            {
                scanf("%s %d %d",cmd,&x,&y);
                if(cmd[0]=='Q')
                {
                    ans=-1;
                    query(1,x,y);
                    printf("%d
    ",ans);
                }
                else
                {
                    update(1,x,y);
                }
            }
        }
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/

  • 相关阅读:
    第五周笔记
    第四周笔记——复制文件(可读时间)
    第三周笔记
    java第6次作业
    java第五次作业
    java第四次作业
    java第三次作业
    第一周Java笔记
    计划进度表
    第六次作业
  • 原文地址:https://www.cnblogs.com/xryz/p/4847765.html
Copyright © 2020-2023  润新知