zoukankan      html  css  js  c++  java
  • vijos 1659 河蟹王国 线段树区间加、区间查询最大值

    题目链接:

    https://vijos.org/p/1659

    题意:

    题解:

    线段树,区间更新(加/减),区间查询最大值

    代码:

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 using namespace std;
      5 typedef long long ll;
      6 #define MS(a) memset(a,0,sizeof(a))
      7 #define MP make_pair
      8 #define PB push_back
      9 const int INF = 0x3f3f3f3f;
     10 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     11 inline ll read(){
     12     ll x=0,f=1;char ch=getchar();
     13     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     15     return x*f;
     16 }
     17 //////////////////////////////////////////////////////////////////////////
     18 const int maxn = 1e5+10;
     19 
     20 ll a[maxn];
     21 
     22 struct node{
     23     int l,r;
     24     ll mx,lazy;
     25     void update(ll val){
     26         mx = val+mx;
     27         lazy += val;
     28     }
     29 }tree[maxn<<2];
     30 
     31 void pushup(int rt){
     32     tree[rt].mx = max(tree[rt<<1].mx, tree[rt<<1|1].mx);
     33 }
     34 
     35 void pushdown(int rt){
     36     int lazyval = tree[rt].lazy;
     37     if(lazyval){
     38         tree[rt<<1].update(lazyval);
     39         tree[rt<<1|1].update(lazyval);
     40         tree[rt].lazy = 0;
     41     }
     42 }
     43 
     44 void build(int rt, int l, int r){
     45     tree[rt].l = l, tree[rt].r = r;
     46     tree[rt].mx = 0, tree[rt].lazy = 0;
     47     if(l == r){
     48         tree[rt].mx = a[l];
     49     }else{
     50         int mid = (l+r)/2;
     51         build(rt<<1,l,mid);
     52         build(rt<<1|1,mid+1,r);
     53         pushup(rt);
     54     }
     55 }
     56 
     57 void update(int rt,int l,int r,ll val){
     58     int L = tree[rt].l, R = tree[rt].r;
     59     if(l<=L && R<=r){
     60         tree[rt].update(val);
     61     }else{
     62         pushdown(rt);
     63         int mid = (L+R)/2;
     64         if(l <= mid) update(rt<<1,l,r,val);
     65         if(r > mid) update(rt<<1|1,l,r,val);
     66         pushup(rt);
     67     }
     68 }
     69 
     70 ll query(int rt,int l,int r){
     71     int L = tree[rt].l, R = tree[rt].r;
     72     if(l<=L && R<=r){
     73         return tree[rt].mx;
     74     }else{
     75         ll ans = 0;
     76         pushdown(rt);
     77         int mid = (L+R)/2;
     78         if(r<=mid)return query(rt<<1,l,r);
     79         else if(l>mid)return query(rt<<1|1,l,r);
     80         else return max(query(rt<<1,l,mid),query(rt<<1|1,mid+1,r));
     81     }
     82 }
     83 /* 这样就WA */
     84 // ll query(int rt,int l,int r){
     85 //     int L = tree[rt].l, R = tree[rt].r;
     86 //     if(l<=L && R<=r)
     87 //         return tree[rt].v;
     88 //     else{
     89 //         ll ans = 0;
     90 //         pushdown(rt);
     91 //         int mid = (L+R)/2;
     92 //         if(l <= mid) ans = max(ans,query(rt<<1,l,r)); 
     93 //         if(r > mid) ans = max(ans,query(rt<<1|1,l,r));
     94 //         pushup(rt);
     95 //         return ans;
     96 //     }
     97 // }
     98 
     99 int main(){
    100     int n=read(),q;
    101     for(int i=1; i<=n; i++)
    102         a[i] = read();
    103     build(1,1,n);
    104     q = read();
    105     while(q--){
    106         int op,a,b,v;
    107         op = read();
    108         if(op == 1){
    109             a=read(),b=read(),v=read();
    110             update(1,a,b,v);
    111         }else{
    112             a=read(),b=read();
    113             ll ans = query(1,a,b);
    114             printf("%lld
    ",ans);
    115         }
    116     }
    117 
    118     return 0;
    119 }
  • 相关阅读:
    Python基础编程常用模块汇总
    博客目录
    网络编程
    python 对象
    python模块和规范开发
    python常用内置函数
    python递归函数和匿名函数
    python装饰器
    python迭代器,生成器,推导式
    python作用域
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827658.html
Copyright © 2011-2022 走看看