【poj 3468】A Simple Problem with Integers 题意&题解&代码(C++)

本文详细解析了POJ 3468题目,该题涉及到对整数区间进行加值操作或区间修改。文章提供了清晰的题意解释及C++代码实现,利用线段树数据结构高效解决区间问题。

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

题目链接:
http://poj.org/problem?id=3468
题意:
操作,给区间加上某个值或区间修改。
代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#define lson (id*2)
#define rson (id*2+1)
using namespace std;
long long tr[800005],lazy[800005],a[100005],ans;
void pushup(int id)
{ tr[id]=tr[lson]+tr[rson]; }
void pushdown(int id,int l,int r)
{
    int mid=(l+r)/2;
    tr[lson]+=lazy[id]*(mid-l+1);
    tr[rson]+=lazy[id]*(r-mid);
    lazy[lson]+=lazy[id];
    lazy[rson]+=lazy[id];
    lazy[id]=0;
}
void build(int id,int l,int r)
{
    if (l>r) return ;
    if (l==r) {tr[id]=a[l]; return ;}
    int mid=(l+r)/2;
    build(lson,l,mid);
    build(rson,mid+1,r);
    pushup(id);
}
void add(int id,int l,int r,int L,int R,long long c)
{
    if (l>r || l>R || r<L) return ;
    if (l>=L && r<=R) 
    {
        tr[id]+=(r-l+1)*c;
        lazy[id]+=c;
        return ;
    }
    int mid=(l+r)/2;
    pushdown(id,l,r);
    if (L<=mid) add(lson,l,mid,L,R,c);
    if (R>=mid+1) add(rson,mid+1,r,L,R,c);
    pushup(id);
}
void query(int id,int l,int r,int L,int R)
{
        if (l>r || l>R || r<L) return ;
        if (l>=L && r<=R)
        {
                ans+=tr[id];
                return ;
        }
        int mid=(l+r)/2;
        pushdown(id,l,r);
        if (L<=mid) query(lson,l,mid,L,R);
        if (R>=mid+1) query(rson,mid+1,r,L,R);
        pushup(id);
}
int n,m,x,y,c;
char p[5];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    scanf("%lld",&a[i]);
    build(1,1,n);
    for (int i=1;i<=m;i++)
    {
        scanf("%s",p);
        if (p[0]=='C')
        {
            scanf("%d%d%d",&x,&y,&c);
            add(1,1,n,x,y,c);
        }
        else
        {
            ans=0;
            scanf("%d%d",&x,&y);
            query(1,1,n,x,y);
            printf("%lld\n",ans);
        }
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值