【vijos1659】河蟹王国 线段树<区间修改+区间最大值>

描述

河蟹王国有一位河蟹国王,他的名字叫羊驼。河蟹王国富饶安定,人们和谐相处。有一天,羊驼国王心血来潮,想在一部分人中挑出最和谐的人。于是,羊驼国王将他的子民排成了一列(==!!b汗~好长呀)。每个人都有一个初始的和谐值。羊驼国王每次会选择一个区间[L,R],这个区间中和谐值最大的人就是国王选出的人。而且,在某一时间,区间[L’,R’]里的人会变得熟悉,因此他们每个人的和谐值都会上升一个相同的值C。羊驼国王想知道,对于每一次选择,他选出的最大和谐值是多少。

输入格式

第一行是一个数N(1<=N<=100000),表示人数。

接下来的N行,每行一个数,表示排成的序列第i个人和谐值的初始值。

接下来是一个数M(1<=M<=100000),表示羊驼国王或他的子民有所活动(羊驼国王选择一个区间算一次,某区间里的人增长和谐值算一次)的总次数。

接下来的M行,每行第一个是一个数K,K是1或2,若K=1,接下来有三个数L,R,C,表示区间[L,R]的所有人增加C的和谐值;若K=2,接下来有两个数L,R,表示国王选择了区间[L,R]。

输出格式

每次对于国王选择区间,输出选择区间里的最大和谐值。

样例输入

5

1
2
3
4
5
3
2 1 4
1 1 3 3
2 3 5

样例输出

4

6

限制

每个测试点1s。

代码

  1 #include <cstdio>
  2 #include <cmath>
  3 #include <cstring>
  4 #include <ctime>
  5 #include <iostream>
  6 #include <algorithm>
  7 #include <set>
  8 #include <vector>
  9 #include <queue>
 10 #include <typeinfo>
 11 #include <map>
 12 #include <stack>
 13 typedef long long ll;
 14 using namespace std;
 15 inline ll read()
 16 {
 17     ll x=0,f=1;
 18     char ch=getchar();
 19     while(ch<'0'||ch>'9')
 20     {
 21         if(ch=='-')f=-1;
 22         ch=getchar();
 23     }
 24     while(ch>='0'&&ch<='9')
 25     {
 26         x=x*10+ch-'0';
 27         ch=getchar();
 28     }
 29     return x*f;
 30 }
 31 //**************************************************************************************
 32 struct ss
 33 {
 34     int l,r,v,tag;
 35 }tr[100001*4];
 36 int n,a[100005];
 37 void build(int k,int l,int r)
 38 {
 39     tr[k].l=l;
 40     tr[k].r=r;
 41     if(l==r) {tr[k].v=a[l];return ;}
 42     int  mid=(l+r)>>1;
 43     build(k<<1,l,mid);
 44     build(k<<1|1,mid+1,r);
 45    // tr[k].v=tr[k<<1].v+tr[k<<1|1].v;
 46     tr[k].v=max(tr[k<<1].v,tr[k<<1|1].v);
 47 }
 48 void pushdown(int k)
 49 {
 50     tr[k<<1].tag+=tr[k].tag;
 51     tr[k<<1|1].tag+=tr[k].tag;
 52     tr[k<<1].v+=tr[k].tag;
 53     tr[k<<1|1].v+=tr[k].tag;
 54     tr[k].tag=0;
 55 }
 56 void update(int k,int l,int r,int x)
 57 {
 58     if(l==tr[k].l&&r==tr[k].r)
 59     {
 60         tr[k].tag+=x;
 61         tr[k].v+=x;
 62         return;
 63     }
 64     if(tr[k].tag) pushdown(k);
 65     int mid=(tr[k].l+tr[k].r)>>1;
 66     if(r<=mid)update(k<<1,l,r,x);
 67     else if(l>mid)update(k<<1|1,l,r,x);
 68     else {
 69         update(k<<1,l,mid,x);
 70         update(k<<1|1,mid+1,r,x);
 71     }
 72     tr[k].v=max(tr[k<<1].v,tr[k<<1|1].v);
 73 }
 74 int ask(int k,int l,int r)
 75 {
 76     if(l==tr[k].l&&tr[k].r==r)
 77     {
 78         return tr[k].v;
 79     }
 80     if(tr[k].tag) pushdown(k);
 81     int mid=(tr[k].l+tr[k].r)>>1;
 82     if(r<=mid) return ask(k<<1,l,r);
 83     else if(l>mid)return ask(k<<1|1,l,r);
 84     else {
 85         return max(ask(k<<1,l,mid),ask(k<<1|1,mid+1,r));
 86     }
 87 }
 88 int main()
 89 {
 90 
 91     scanf("%d",&n);
 92     for(int i=1;i<=n;i++)
 93     {
 94         scanf("%d",&a[i]);
 95     }
 96     build(1,1,n);
 97     int q;
 98     scanf("%d",&q);
 99     for(int i=1;i<=q;i++)
100     {
101         int t;
102         scanf("%d",&t);
103         if(t==2)
104         {
105             int x,y;
106             scanf("%d%d",&x,&y);
107             printf("%d
",ask(1,x,y));
108         }
109         else {
110             int x;int y;int c;
111             scanf("%d%d%d",&x,&y,&c);
112             update(1,x,y,c);
113         }
114     }
115     return 0;
116 }
原文地址:https://www.cnblogs.com/zxhl/p/4688489.html