这题,好像不卡线段树...

P3374 【模板】树状数组 1

但是板子2卡 @[tigatm](/space/show?uid=120594)
by Jelly_Goat @ 2019-02-17 16:59:03


@[Jelly_Goat](/space/show?uid=122927) 事实上板子2也不卡(
by Juan_feng @ 2019-02-17 17:03:50


拿模板st表和模板树状数组练线段树....
by 龙·海流 @ 2019-02-17 17:24:04


为什么我线段树超时了QAQ ```cpp #include<iostream> #include<cstdio> #include<cmath> #include<string.h> #define ll long long using namespace std; ll Left(ll a){return a*2;} ll Right(ll a){return a*2+1;} ll i,j,k,m,n,a[1000001],ans[1000001],Lazy[1000001]; void PushUp(ll now) { ans[now]=ans[Left(now)]+ans[Right(now)]; } void Build(ll now,ll l,ll r) { if(l==r){ans[now]=a[l];return;} ll mid=(l+r)/2; Build(Left(now),l,mid); Build(Right(now),mid+1,r); PushUp(now); } void Function(ll now,ll l,ll r,ll Add) { Lazy[now]+=Add; ans[now]+=Add*(r-l+1); } void PushDown(ll now,ll l,ll r) { ll mid=(l+r)/2; Function(Left(now),l,mid,Lazy[now]); Function(Right(now),mid+1,r,Lazy[now]); Lazy[now]=0; } void Data(ll NowL,ll NowR,ll l,ll r,ll now,ll Add) { if(NowL<=l&&NowR>=r) { ans[now]+=Add*(r-l+1); Lazy[now]+=Add; return; } PushDown(now,l,r); ll mid=(l+r)/2; if(NowL<=mid)Data(NowL,NowR,l,mid,Left(now),Add); if(NowR>mid)Data(NowL,NowR,mid+1,r,Right(now),Add); PushUp(now); } ll Query(ll NowL,ll NowR,ll l,ll r,ll now) { ll Return=0; if(NowL<=l&&NowR>=r)return ans[now]; ll mid=(l+r)/2; PushDown(now,l,r); if(NowL<=mid)Return+=Query(NowL,NowR,l,mid,Left(now)); if(NowR>mid)Return+=Query(NowL,NowR,mid+1,r,Right(now)); return Return; } int main() { cin>>n>>m; for(i=1;i<=n;i++)cin>>a[i]; Build(1,1,n); for(i=1;i<=m;i++) { int Read; cin>>Read; if(Read==1) { int f,l,Add; cin>>f>>Add; l=f; Data(f,l,1,n,1,Add); } if(Read==2) { int f,l; cin>>f>>l; cout<<Query(f,l,1,n,1)<<endl; } } return 0; } ```
by Limit @ 2019-03-04 17:54:28


然而平衡树也能跑得飞快(
by 小菜鸟 @ 2019-06-19 09:29:00


|