zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    蒟蒻の搜索学习总结
    蒟蒻の红黑树总结
    数据结构与算法
    linux常用命令
    Linux防火墙Firewall和Iptables的使用
    Spring Boot 自定义Intercepter
    Spring Boot 自定义Filter
    SpringBoot 全局异常配置
    SpringBoot设置支持跨域请求
    springboot整合shiro安全框架
  • 原文地址:https://www.cnblogs.com/xryz/p/4847765.html
Copyright © 2011-2022 走看看