線段樹 區間加區間乘

2021-08-22 03:07:28 字數 1883 閱讀 1063

給出序列 a1,a2,…an(0≤ai≤109),有關序列的四種操作:

1. al,al+1,…,ar(1≤l≤r≤n)加上 x(-103≤x≤103)

2. al,al+1,…,ar(1≤l≤r≤n)乘上 x(-103≤x≤103)

3. al,al+1,…,ar(1≤l≤r≤n)變成 x-al,x-al+1 ,…,x-ar(-103≤x≤103)

4. 求:

(即求:al+al+1+al+2+…+ar(1≤l≤r≤n)

所有操作均模 109+7

第一行包含兩個數 n(1≤n≤105)和 m(1≤m≤105),表示序列長度和操作次數

接下來一行包含 n 個數,空格隔開,表示 a1,a2,…,an 。

接下來 m 行,每行為以下 4 種格式之一:

對於每次詢問,輸出單獨一行表示答案。

輸入

5 4 

1 2 3 4 5 

0 1 5 1 

1 1 5 -1 

2 1 5 1 

3 5 5

輸出

7
**: 

#include #define ll long long

using namespace std;

const int max=100010;

const int mod=1e9+7;

int n,m,ans;

int num[max];

ll add[max<<2],mul[max<<2],sum[max<<2];

inline int get_int()

for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';

return x*f;

}inline void update(ll root)

inline void build(int root,int l,int r)

int mid = l + r >> 1;

mul[root] = 1;

build(root<<1,l,mid),build(root<<1|1,mid+1,r);

update(root);

}inline void pushdown(int root,int l,int r,int mid)

if(add[root] != 0) }

inline void add(int root,int l,int r,int l,int r,int num)

int mid = l + r >> 1;

pushdown(root,l,r,mid);

if(l <= mid) add(root<<1,l,mid,l,r,num);

if(r > mid) add(root<<1|1,mid+1,r,l,r,num);

update(root);

}inline void mul(int root,int l,int r,int l,int r,int num)

int mid = l + r >> 1;

pushdown(root,l,r,mid);

if(l <= mid) mul(root<<1,l,mid,l,r,num);

if(r > mid) mul(root<<1|1,mid+1,r,l,r,num);

update(root);

}inline int q(int root,int l,int r,int l,int r)

int main()

if(flag == 1)

if(flag == 2)

if(flag == 3)

}return 0;

}

線段樹多種操作模板(區間加,區間乘,區間賦值)

做這種題目呢,我們只需要分清楚每種操作的優先順序就行了。在這裡,我們規定優先順序 區間賦值 區間乘 區間加。也沒啥好說而呀,我要咋辦 記得 que ry query quer y 和 upd at eupdate update 時要 標記下飯 放就行了。放 吧。include define ll l...

線段樹動態開點區間加區間求和

陝西師範大學第七屆程式設計競賽網路同步賽 h.萬惡的柯怡 保證葉子節點被完整的覆蓋,需要開節點,就把左右兒子都開出來,其餘和普通線段樹一樣。用結構體內部函式,記憶體不足,第一次遇見本地問題不嚴重 不明嚼慄?include typedef long long ll const int n 400001...

ZKW線段樹區間加區間取最值

本來以為是和zkw單點修改之類的簡單技巧,但是今天卡常的時候學習了一下發現有點離譜。rx tr x trx 表示max f ax max x max max maxfax maxx 也就是線段樹上乙個節點和他父親區間最大值的差分,我們現在可以知道乙個線段樹上乙個整區間的最大值就是他到根的和。那麼我們...