码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】线段树 1(洛谷_3372)

时间:2017-08-14 23:37:22      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:sed   str   name   ++   view   inline   algorithm   分享   img   

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

技术分享
#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)

标签:sed   str   name   ++   view   inline   algorithm   分享   img   

原文地址:http://www.cnblogs.com/Yzyet/p/7360418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!