模板线段树 1(洛谷_3372)

Posted Yzyet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板线段树 1(洛谷_3372)相关的知识,希望对你有一定的参考价值。

这题的做法就像题目说的那样。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
inline ll read(){
    ll t=1,num=0;char c=getchar();
    while(c>\'9\'||c<\'0\'){if(c==\'-\')t=-1;c=getchar();}
    while(c>=\'0\'&&c<=\'9\'){num=num*10+c-\'0\';c=getchar();}
    return num*t;
}
const ll maxn=100010;
ll mark[4*maxn],t[4*maxn],a[maxn],n,m;
void build(ll ro,ll l,ll r){
    mark[ro]=0;
    if(l==r){t[ro]=a[l];return;}
    ll mid=(l+r)>>1;
    build(ro*2,l,mid);build(ro*2+1,mid+1,r);
    t[ro]=t[ro*2]+t[ro*2+1];
}
void pushdown(ll ro,ll l,ll r){
    ll mid=(l+r)>>1;
    if(mark[ro]&&l!=r){
        mark[ro*2]+=mark[ro];
        mark[ro*2+1]+=mark[ro];
        t[ro*2]+=(mid-l+1)*mark[ro];
        t[ro*2+1]+=(r-mid)*mark[ro];
        mark[ro]=0;
    }
}
ll ask(ll ro,ll l,ll r,ll x,ll y){
    if(x>r||y<l)return 0;
    if(x<=l&&r<=y)return t[ro];
    pushdown(ro,l,r);
    ll mid=(l+r)>>1;
    return ask(ro*2,l,mid,x,y)+ask(ro*2+1,mid+1,r,x,y);
}
void change(ll ro,ll l,ll r,ll x,ll y,ll add){
    if(x>r||y<l)return;
    if(x<=l&&r<=y){mark[ro]+=add;t[ro]+=(r-l+1)*add;return;}
    pushdown(ro,l,r);
    ll mid=(l+r)>>1;
    change(ro*2,l,mid,x,y,add);change(ro*2+1,mid+1,r,x,y,add);
    t[ro]=t[ro*2]+t[ro*2+1];
}
int main()
{
    n=read();m=read();
    for(ll i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(ll i=1;i<=m;i++){
        ll k=read(),x=read(),y=read();
        if(k==1)change(1,1,n,x,y,read());
        else printf("%lld\\n",ask(1,1,n,x,y));
    }
    return 0;
}
View Code

一开始,wa了3个点。看了一下,突然发现。。

其实是输出没有lld。

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

以上是关于模板线段树 1(洛谷_3372)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P3372 模板线段树 1

[模板]洛谷T3372 线段树 模板1

洛谷—— P3372 模板线段树 1

洛谷 P3372 模板线段树 1

洛谷P3372模板线段树 1

洛谷P3372 模板线段树 1(节省内存版)