模板线段树 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; }
一开始,wa了3个点。看了一下,突然发现。。
其实是输出没有lld。
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
以上是关于模板线段树 1(洛谷_3372)的主要内容,如果未能解决你的问题,请参考以下文章