zoukankan      html  css  js  c++  java
  • C

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=221#problem/C

    #include <stdio.h>
    #include<string.h>
    struct Node
    {
        int sum;
        int l,r;
    } node[800001];
    int num[200001];
    int max;
    int max1(int x,int y)
    {
        return x>y?x:y;
    }
    void build(int rt,int ll,int rr)
    {
        if(ll==rr)
        {
            node[rt].l=node[rt].r=ll;
            node[rt].sum=num[ll];
            return;
        }
        node[rt].l=ll;
        node[rt].r=rr;
        int mid=(ll+rr)/2;
    
        build(rt*2,ll,mid);
        build(rt*2+1,mid+1,rr);
        node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum);
    }
    void query(int rt,int s,int e)
    {
        int mid;
        if(node[rt].l==s&&node[rt].r==e)
        {
            if(node[rt].sum>max)
                max = node[rt].sum;
                return ;
        }
        mid=(node[rt].l+node[rt].r)/2;
         if(s>mid)
            query(rt*2+1,s,e);
        else if(e<=mid)
            query(rt*2,s,e);
        else
        {
            query(rt*2,s,mid);
            query(rt*2+1,mid+1,e);
        }
    
    }
    void update(int rt,int pos,int v)
    {
        if(node[rt].l==pos&&node[rt].r==pos)
        {
            node[rt].sum = v;
            return;
        }
        int mid;
        mid=(node[rt].l+node[rt].r)/2;
        if(pos<=mid)
        {
            update(rt*2,pos,v);
        }
        else
        {
            update(rt*2+1,pos,v);
        }
    
        node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum);
    }
    int main()
    {
        int i;
        int n,m;
        char ch[10];
        int x,y;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i = 1; i<=n; i++)
            {
                scanf("%d
    ",&num[i]);
            }
            build(1,1,n);
            for(i = 1; i<=m; i++)
            {
                scanf("%s%d%d",ch,&x,&y);
                if(ch[0] == 'Q')
                {
                    max = 0;
                    query(1,x,y);
                    printf("%d
    ",max);
                }
                if(ch[0] == 'U')
                    update(1,x,y);
            }
        }
        return 0;
    }

    线段树问题,二分思想。

  • 相关阅读:
    centos7安装YouCompleteMe,vim打造成C++的IDE
    java循环定时器@Scheduled的使用
    js使用“toFixed( )”保留小数点后两位
    linux小本
    解决Maven资源过滤问题
    在Maven普通项目上添加Web app的支持
    项目中添加lib依赖
    回顾Servlet
    Tomcat 中文乱码
    Initialization failed for 'https://start.spring.io' Please check URL
  • 原文地址:https://www.cnblogs.com/yangyongqian/p/3900124.html
Copyright © 2011-2022 走看看