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;
    }
    
    
    戒骄戒躁,百炼成钢!
  • 相关阅读:
    BFS(双向) HDOJ 3085 Nightmare Ⅱ
    BFS+Hash(储存,判重) HDOJ 1067 Gap
    BFS(判断状态) HDOJ 3533 Escape
    三进制状压 HDOJ 3001 Travelling
    BFS(八数码) POJ 1077 || HDOJ 1043 Eight
    Codeforces Round #332 (Div. 2)
    BFS HDOJ 2102 A计划
    if语句
    shell脚本编程测试类型下
    shell脚本编程测试类型上
  • 原文地址:https://www.cnblogs.com/Pecoz/p/12426647.html
Copyright © 2011-2022 走看看