线段树

撰写于 2019-11-12 修改于 2019-11-12 分类 ACM 标签 线段树

线段树模板 用于处理区间问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include<bits/stdc++.h>
#define ll long long
#define dl double
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define println(x){printf(":\n");for (int tmpi=1;tmpi<=n;tmpi++)printf("%d ",x[i]);printf("\n");}
using namespace std;

const int N=1e5+7;
const int INF=0x3f3f3f3f;
const int M=1e9+7;

class poi{
public:
ll l,r,sum,maxx,add,lc,rc;
};

class seg{
public:
vector<poi> s;

void bulid(ll x){
if (s[x].lc) return;
ll l=s[x].l,r=s[x].r,mid=(l+r)>>1;
s.push_back((poi){l,mid,0,0,0,0,0});
s[x].lc=s.size()-1;
s.push_back((poi){mid+1,r,0,0,0,0,0});
s[x].rc=s.size()-1;
}

void pushdown(ll x){
bulid(x);
ll lc=s[x].lc,rc=s[x].rc;
s[lc].add+=s[x].add;
s[lc].sum+=s[x].add*(s[lc].r-s[lc].l+1);
s[rc].add+=s[x].add;
s[rc].sum+=s[x].add*(s[rc].r-s[rc].l+1);
updata(x);
}

void updata(ll x){
s[x].add=0;
s[x].sum=s[s[x].lc].sum+s[s[x].rc].sum;
s[x].maxx=max(s[s[x].lc].maxx,s[s[x].rc].maxx);
}

void add(ll x,ll l,ll r,ll t){
if (l<=s[x].l&&s[x].r<=r){
s[x].sum+=t*(s[x].r-s[x].l+1);
s[x].add+=t;
s[x].maxx+=t;
return;
}
else{
pushdown(x);
if (l<=s[s[x].lc].r){
add(s[x].lc,l,r,t);
}
if (r>=s[s[x].rc].l){
add(s[x].rc,l,r,t);
}
updata(x);
}
}

ll query_sum(ll x,ll l,ll r){
if (l<=s[x].l&&s[x].r<=r){
return s[x].sum;
}
else{
pushdown(x);
ll tmp=0;
if (l<=s[s[x].lc].r){
tmp+=query_sum(s[x].lc,l,r);
}
if (r>=s[s[x].rc].l){
tmp+=query_sum(s[x].rc,l,r);
}
return tmp;
}
}

ll query_max(ll x,ll l,ll r){
if (l<=s[x].l&&s[x].r<=r){
return s[x].maxx;
}
else{
pushdown(x);
ll tmp=0;
if (l<=s[s[x].lc].r){
tmp=max(tmp,query_max(s[x].lc,l,r));
}
if (r>=s[s[x].rc].l){
tmp=max(tmp,query_max(s[x].rc,l,r));
}
return tmp;
}
}
}tree;

int n;
int m;
ll l,r,t;
ll a;

void read(){
scanf("%d",&n);
tree.s.push_back((poi){1,n,0,0,0,0});
for (int i=1;i<=n;i++){
scanf("%lld",&a);
tree.add(0,i,i,a);
}
tree.add(0,1,2,4);
cout<<tree.query_max(0,1,4);
/*scanf("%d",&m);
char ch[5];
for (int i=1;i<=m;i++){
scanf("%s",ch);
if (ch[0]=='S'){
scanf("%lld%lld",&l,&r);
printf("%lld\n",tree.sum(0,l,r));
}
if (ch[0]=='A'){
scanf("%lld%lld%lld",&l,&r,&t);
tree.add(0,l,r,t);
}
}*/
}

int main(){
read();
return 0;
}

目录

Site by hdy using Hexo & Random

acm

Hide