#include
<
iostream
>
using
namespace
std;
typedef
struct
{
int
l,r;
int
sum;
int
value;
int
lvalue;
int
rvalue;
}Node;
Node tree[
250000
];
inline
int
max(
int
a,
int
b){
if
(a
>
b)
return
a;
else
return
b;
}
void
build(
int
Num,
int
l,
int
r){
tree[Num].l
=
l;
tree[Num].r
=
r;
tree[Num].value
=
0
;
if
(l
<
r){
int
mid
=
(l
+
r)
>>
1
;
build(Num
*
2
,l,mid);
build(Num
*
2
+
1
,mid
+
1
,r);
}
}
void
modify(
int
Num){
tree[Num].sum
=
tree[Num
*
2
].sum
+
tree[Num
*
2
+
1
].sum;
//
区间的总和
tree[Num].lvalue
=
max(tree[Num
*
2
].lvalue,tree[Num
*
2
].sum
+
tree[Num
*
2
+
1
].lvalue);
//
左边的最大值=左孩子左边的值,或者左孩子的总和加右孩子左边的值(即通过中间点)
tree[Num].rvalue
=
max(tree[Num
*
2
+
1
].rvalue,tree[Num
*
2
+
1
].sum
+
tree[Num
*
2
].rvalue);
//
右边的最大值=右孩子右边的值,或者右孩子的综合加左孩子右边的值(即通过中间点)
tree[Num].value
=
tree[Num
*
2
].rvalue
+
tree[Num
*
2
+
1
].lvalue;
//
父亲的最大值=左孩子右边的值加上右孩子左边的值(即通过中间点)
tree[Num].value
=
max(tree[Num].value,tree[Num
*
2
].value);
//
可能只在左边
tree[Num].value
=
max(tree[Num].value,tree[Num
*
2
+
1
].value);
//
可能只在右边
}
void
insert(
int
Num,
int
r,
int
value){
if
(tree[Num].l
==
tree[Num].r){
tree[Num].sum
=
value;
tree[Num].value
=
value;
tree[Num].lvalue
=
value;
tree[Num].rvalue
=
value;
return
;
}
int
mid
=
(tree[Num].l
+
tree[Num].r)
>>
1
;
if
(r
<=
mid) insert(Num
*
2
,r,value);
else
insert(Num
*
2
+
1
,r,value);
modify(Num);
}
Node query(
int
Num,
int
l,
int
r){
if
(l
==
tree[Num].l
&&
r
==
tree[Num].r)
return
tree[Num];
int
mid
=
(tree[Num].l
+
tree[Num].r)
>>
1
;
if
(r
<=
mid)
return
query(Num
*
2
,l,r);
else
if
(l
>
mid)
return
query(Num
*
2
+
1
,l,r);
else
{
Node lt
=
query(Num
*
2
,l,mid);
Node rt
=
query(Num
*
2
+
1
,mid
+
1
,r);
Node tmp;
tmp.sum
=
lt.sum
+
rt.sum;
tmp.lvalue
=
max(lt.lvalue,lt.sum
+
rt.lvalue);
tmp.rvalue
=
max(rt.rvalue,rt.sum
+
lt.rvalue);
tmp.value
=
lt.rvalue
+
rt.lvalue;
tmp.value
=
max(tmp.value,lt.value);
tmp.value
=
max(tmp.value,rt.value);
return
tmp;
}
}
int
main()
{
int
n,m,x,y,z;
scanf(
"
%d
"
,
&
n);
build(
1
,
1
,n);
for
(
int
i
=
1
;i
<=
n;
++
i){
scanf(
"
%d
"
,
&
x);
insert(
1
,i,x);
}
scanf(
"
%d
"
,
&
m);
for
(
int
i
=
1
;i
<=
m;
++
i){
scanf(
"
%d%d%d
"
,
&
z,
&
x,
&
y);
if
(z)
printf(
"
%d\n
"
,query(
1
,x,y).value);
else
insert(
1
,x,y);
}
return
0
;
}
vijos1083,虽然一样的题目,但是orz出题的人~~~,还是贴出来吧!
#include<iostream>
using namespace std;
struct Node{
int l,r;
int sum;
int value;
int lvalue,rvalue;
};
Node tree[2100000];
int A[500010];
inline int max(int a,int b){
return a>b?a:b;
}
void modfiy(int Num){
tree[Num].sum=tree[Num*2].sum+tree[Num*2+1].sum;
tree[Num].lvalue=max(tree[Num*2].lvalue,tree[Num*2].sum+tree[Num*2+1].lvalue);
tree[Num].rvalue=max(tree[Num*2+1].rvalue,tree[Num*2+1].sum+tree[Num*2].rvalue);
tree[Num].value=tree[Num*2].rvalue+tree[Num*2+1].lvalue;
tree[Num].value=max(tree[Num].value,tree[Num*2].value);
tree[Num].value=max(tree[Num].value,tree[Num*2+1].value);
}
void build(int Num,int l,int r){
tree[Num].l=l;
tree[Num].r=r;
if(l<r){
int mid=(l+r)>>1;
build(Num*2,l,mid);
build(Num*2+1,mid+1,r);
modfiy(Num);
}
else{
tree[Num].sum=A[r];
tree[Num].value=A[r];
tree[Num].lvalue=A[r];
tree[Num].rvalue=A[r];
}
}
void insert(int Num,int r,int value){
if(tree[Num].l==tree[Num].r){
tree[Num].sum=value;
tree[Num].value=value;
tree[Num].lvalue=value;
tree[Num].rvalue=value;
return;
}
int mid=(tree[Num].l+tree[Num].r)>>1;
if(r<=mid) insert(Num*2,r,value);
else insert(Num*2+1,r,value);
modfiy(Num);
}
Node query(int Num,int l,int r){
if(l==tree[Num].l&&r==tree[Num].r)
return tree[Num];
int mid=(tree[Num].l+tree[Num].r)>>1;
if(r<=mid) return query(Num*2,l,r);
else if(l>mid) return query(Num*2+1,l,r);
else{
Node lt=query(Num*2,l,mid);
Node rt=query(Num*2+1,mid+1,r);
Node tmp;
tmp.sum=lt.sum+rt.sum;
tmp.lvalue=max(lt.lvalue,lt.sum+rt.lvalue);
tmp.rvalue=max(rt.rvalue,rt.sum+lt.rvalue);
tmp.value=lt.rvalue+rt.lvalue;
tmp.value=max(tmp.value,lt.value);
tmp.value=max(tmp.value,rt.value);
return tmp;
}
}
int main()
{
int n,m;
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&A[i]);
build(1,1,n);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&z,&x,&y);
if(z==1){
if(x>y){
int tmp=x;
x=y;y=tmp;
}
int ans=query(1,x,y).value;
printf("%d ",ans);
}
else
insert(1,x,y);
}
return 0;
}
posted on 2009-04-26 15:47
xfstart07 阅读(175)
评论(0) 编辑 收藏 引用 所属分类:
代码库