POJ 3468 A Simple Problem with Integers(线段树 区间修改)
本题数组要开大点,而且要用long long
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const ll maxn=100010;
ll lazy[4*maxn],tr[4*maxn],r[4*maxn];
void pushdown(ll po,ll ljs,ll rjs)//向下推lazy标记
{
if(lazy[po])
{
//通过本区间lazy标记值改变下面区间lazy标记值
lazy[2*po]+=lazy[po];
lazy[2*po+1]+=lazy[po];
tr[2*po]+=lazy[po]*ljs;//ljs左边数量
tr[2*po+1]+=lazy[po]*rjs;//rjs右边数量
lazy[po]=0;
}
}
void line_change(ll a,ll b,ll c,ll le,ll ri,ll po)//区间修改
{
if(a<=le&&b>=ri)//当前区间完全在要进行修改的区间内
{
tr[po]+=c*(ri-le+1);
lazy[po]+=c;//修改本区间lazy标记值
ll av=(le+ri)/2;
}
else//只在进行修改的区间属于当前区间时进行
{
ll av=(le+ri)/2;
pushdown(po,av-le+1,ri-av);
if(a<=av)
line_change(a,b,c,le,av,2*po);
if(b>av)
line_change(a,b,c,av+1,ri,2*po+1);
tr[po]=tr[po*2]+tr[po*2+1];//自下而上对结点更新
}
}
void build(ll le,ll ri,ll po)//创建树
{
if(le==ri)
tr[po]=r[ri];//每个叶结点
else
{
build(le,(le+ri)/2,2*po);//左边
build((le+ri)/2+1,ri,2*po+1);//右边
tr[po]=tr[po*2]+tr[po*2+1];//自下而上对结点更新
}
}
ll query(ll a,ll b,ll le,ll ri,ll po)//区间查询
{
if(a<=le&&b>=ri)
return tr[po];
ll av=(le+ri)/2;
pushdown(po,av-le+1,ri-av);//下推标记,不然返回的可能是修改之前的值
ll sum=0;
//递归返回累计答案
if(a<=av)
sum+=query(a,b,le,av,po*2);
if(b>av)
sum+=query(a,b,av+1,ri,po*2+1);
return sum;
}
int main()
{
ll n,m;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
for(ll i=1;i<=n;++i)
{
scanf("%lld",&r[i]);
}
build(1,n,1);
for(ll i=0;i<m;++i)
{
char c[2];
scanf("%s",c);
if(c[0]=='Q')
{
ll a,b;
scanf("%lld%lld",&a,&b);
printf("%lld\n",query(a,b,1,n,1));
}
if(c[0]=='C')
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
line_change(a,b,c,1,n,1);
}
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)