SPOJ GSS1 [线段树]

本文介绍了一种基于线段树的数据结构实现方法,用于解决区间合并问题。通过维护区间的左、右及本身值,可以高效地进行区间查询与更新操作。文中提供了一个具体的实现案例,包括线段树的构建、查询等核心代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Can you answer these queries I

题目连接

题解

普普通通的线段树区间合并,维护左、右、本身的值即可

#include <iostream>  
#include <cstdio>  
#include <algorithm>  
#define INF 0x3f3f3f3f  
using namespace std;  
struct node{  
    int sum,mx,lx,rx;
    node(int x = 0){  
        sum = mx = lx = rx = x; 
    }  
}tree[1000001];  
int ql,qr;  
node update(node x, node y){       
    node ans;  
    ans.sum = x.sum + y.sum;          
    ans.mx = max(x.rx + y.lx, max(x.mx, y.mx));  
    ans.lx = max(x.lx, x.sum + y.lx); 
    ans.rx = max(y.rx, y.sum + x.rx);
    return ans;  
}  

void build(int num,int l,int r){  
    if(l == r){  
        int x;  
        scanf("%d",&x);  
        tree[num] = node(x);  
        return ;  
    }  
    int mid = (l+r)>> 1;  
    build(num*2,l,mid);  
    build(num*2+1,mid+1,r);  
    tree[num] = update(tree[num*2], tree[num*2+1]);  
}  

node query(int num,int l,int r){  
    if(ql <= l && r <= qr)  return tree[num];  
    node x(-INF), y(-INF);  
    x.sum=y.sum=0;
    int mid = (l+r)>> 1;  
    if (ql <= mid)  x = query(num*2,l,mid);  
    if (qr > mid)   y = query(num*2+1,mid+1,r); 
    return update(x,y);  
}  
int main(){  
    int n,m;  
    while(scanf("%d", &n)!=EOF){  
        build(1,1,n);  
        scanf("%d",&m);  
        while(m--){  
            scanf("%d%d",&ql,&qr);  
            printf("%d\n", query(1,1,n).mx);  
        }  
    }  
    return 0;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值