日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记

發(fā)布時(shí)間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門

這道題屬實(shí)是線段樹的道比刷題,又加又乘的,當(dāng)然還可能會(huì)有乘除,階乘等等可能的情況。

對(duì)于這道題,主要的一個(gè)就是怎么記錄lazy標(biāo)記,首先的話一個(gè)數(shù)組是肯定不行的,設(shè)乘的為lazy,加的為add。

每次我們更新時(shí),要用lazy數(shù)組去更新add數(shù)組。

關(guān)鍵是pushdown的時(shí)候注意一下,下放的時(shí)候比較復(fù)雜。

代碼如下:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define inff 0x3f3f3f3f
#define lowbit(x) x&(-x)
#define me(a,b) memset(a,b,sizeof(a))
#define min4(a,b,c,d) min(min(a,b),min(c,d))
#define min3(x,y,z) min(min(x,y),min(y,z))
#define max4(a,b,c,d) max(max(a,b),max(c,d))
#define max3(x,y,z) max(max(x,y),max(y,z))
typedef long long ll;
using namespace std;
const int maxn=1e5+5;
ll mod,n,m;
ll tree[maxn<<2],lazy[maxn<<2],add[maxn<<2],a[maxn];
void pushup(int i,int l,int r)
{tree[i]=(tree[lson]+tree[rson])%mod;
}
///i表示父親,lson左兒子,rson右兒子,lazy記錄乘,add記錄加
void pushdown(int i,int l,int r)
{if(lazy[i]==1&&add[i]==0)//如果乘的為1,加的為0,就不做處理return;int mid=half;lazy[lson]=lazy[i]*lazy[lson]%mod;add[lson]=(lazy[i]*add[lson]%mod+add[i])%mod;tree[lson]=(lazy[i]*tree[lson]%mod+add[i]*(mid-l+1)%mod)%mod;lazy[rson]=lazy[rson]*lazy[i]%mod;add[rson]=(lazy[i]*add[rson]%mod+add[i])%mod;tree[rson]=(lazy[i]*tree[rson]%mod+add[i]*(r-mid)%mod)%mod;lazy[i]=1;add[i]=0;
}
void update(int i,int l,int r,ll ql,ll qr,ll val,ll x)
{if(ql<=l&&qr>=r){if(x==1){lazy[i]=lazy[i]*val%mod;add[i]=add[i]*val%mod;tree[i]=tree[i]*val%mod;}else{add[i]=(add[i]+val)%mod;tree[i]=(tree[i]+(r-l+1)*val)%mod;}return;}pushdown(myself);int mid=half;if(qr<=mid) update(Lson,ql,qr,val,x);else if(ql>mid) update(Rson,ql,qr,val,x);else{update(Lson,ql,mid,val,x);update(Rson,mid+1,qr,val,x);}pushup(myself);
}
ll query(int i,int l,int r,ll ql,ll qr)
{if(ql<=l&&qr>=r)return tree[i]%mod;pushdown(myself);int mid=half;ll ans=0;if(ql<=mid) ans=(ans+query(Lson,ql,qr))%mod;if(qr>mid)  ans=(ans+query(Rson,ql,qr))%mod;return ans;
}
void build(int i,int l,int r)
{lazy[i]=1;add[i]=0;if(l==r){tree[i]=a[l];return ;}int mid=half;build(Lson);build(Rson);pushup(myself);
}
int main()
{while(scanf("%lld %lld",&n,&mod)!=EOF){for(int i=1;i<=n;i++){scanf("%lld",&a[i]);a[i]%=mod;}build(1,1,n);scanf("%lld",&m);ll num,x,y,z;while(m--){scanf("%lld",&num);if(num!=3){scanf("%lld %lld %lld",&x,&y,&z);update(1,1,n,x,y,z,num);}else{scanf("%lld %lld",&x,&y);printf("%lld\n",query(1,1,n,x,y)%mod);}}}return 0;
}

?

總結(jié)

以上是生活随笔為你收集整理的HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。