洛谷P3373 模板 線段樹2

2021-08-08 07:54:55 字數 1348 閱讀 7386

這題有毒啊,敲了我一晚上加一早上,總算a了。

由於有加和乘兩個操作,要用2個lazy陣列。

核心難點就是2個lazy陣列會相互影響。

因為乘影響加,加不影響乘,所以我們先算乘。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define rep(i,m,n) for(int i=m;i<=n;i++)

#define dop(i,m,n) for(int i=m;i>=n;i--)

#define lowbit(x) (x&(-x))

#define ll long long

#define inf 2147483647

using

namespace

std;

inline

intread

() while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();

return s*w;

}const

int maxn=100000;

ll a[maxn+10],sum[(maxn<<2)+10],n,m,b,c,d,e,add[(maxn<<2)+10],mul[(maxn<<2)+10],mod; //安全起見,都開long long

void

pushdown

(int now,int m)

if(add[now])

}void

build

(int now,int l,int r)

}ll query

(int now,int l,int r,int wl,int wr)

void

change

(int now,int l,int r,int wl,int wr,int p,int mode)

pushdown(now,r-l+1);

int mid=(l+r)>>1;

change(now<<1,l,mid,wl,wr,p,mode);

change(now<<1|1,mid+1,r,wl,wr,p,mode);

sum[now]=(sum[now<<1]+sum[now<<1|1])%mod;

}int

main

() if(b==2)

if(b==3)

}return

0;}

洛谷 P3373 模板 線段樹 2

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個...

線段樹(洛谷P3373模板2)

日常膜拜dalao 財神萬歲!話說這個線段樹今天折磨了我五個小時然後終於發現少打了乙個2.離開學還有4天然而作業一字未動絲毫不慌 ing 原題連線 洛谷線段樹模板2 要求 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 ...

洛谷 P3373 模板 線段樹 2

洛谷 p3373 模板 線段樹 2 已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 思路 兩個lazy標記 add和mul,怎麼下放?我遇到的問題 很多題解上來就說先乘後加比先加後乘好處理。我疑惑 如果有兩個lazy標記,不知...