zoukankan      html  css  js  c++  java
  • VJ I Hate It (线段树求区间最大值)

    原题
    这是一道线段树裸体,记录一下加深印象。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,a[1000005];
    struct tree//结构体存储线段树
    {
       int l,r,dat;
    }t[1000000];//要开叶节点数的四倍大小防止越界,这里瞎开的
    void build(int p,int l,int r)//建树
    {
      t[p].l=l,t[p].r=r;
      if(l==r)
      {
       t[p].dat=a[l];
       return ;
      }
      int mid=l+r>>1;
      build(p*2,l,mid);//左子节点
      build(p*2+1,mid+1,r);//右子节点
      t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
    }
    void change(int p,int x,int v)//单点修改
    {
        if(t[p].l==t[p].r)
         {
           t[p].dat=v;
           return ;
         }
         int mid=t[p].l+t[p].r>>1;
         if(x<=mid)
            change(p*2,x,v);
         else
            change(p*2+1,x,v);
         t[p].dat=max(t[p*2].dat,t[p*2+1].dat);
    }
    int ask(int p,int l,int r)//区间查询
    {
       if(l<=t[p].l&&t[p].r<=r)
        return t[p].dat;
       int mid=(t[p].l+t[p].r)>>1;
       int val=-(1<<20);
       if(l<=mid)
        val=max(val,ask(p*2,l,r));
       if(r>mid)
        val=max(val,ask(p*2+1,l,r));
       return val;
    }
    int main()
    {
        while(cin>>n>>m)
        {
        for(int i=1;i<=n;i++)
        {
           scanf("%d",&a[i]);
        }
        build(1,1,n);
        while(m--)
        {
           char s[5];
           int x,y;
           scanf("%s%d%d",s,&x,&y);
           if(s[0]=='Q')
            cout<<ask(1,x,y)<<endl;
           else
            change(1,x,y);
        }
        }
    return 0;
    }
    
    
    戒骄戒躁,百炼成钢!
  • 相关阅读:
    [Tool]使用ConfuserEx混淆代码
    Python_安装官方whl包和tar.gz包
    0017_集合的补充
    0016_练习题d2
    0015_各数据类型方法代码实现
    0014_基本数据类型及常用方法剖析
    0013_运算符
    0012_编码转换
    0011_练习题d1
    0010_while循环
  • 原文地址:https://www.cnblogs.com/Pecoz/p/12426647.html
Copyright © 2011-2022 走看看