spoj 1716. Can you answer these queries III
#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 ;
}
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 ;
}
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 ;
}