12 Challenge 5(線段樹區間直接修改)

2022-05-09 19:16:03 字數 1948 閱讀 8561

總時間限制: 

10000ms

單個測試點時間限制: 

1000ms

記憶體限制: 

262144kb

描述給乙個長為n的數列,有m次操作,每次操作是以下兩種之一:

(1)將某連續一段同時改成乙個數

(2)求數列中某連續一段的和

輸入第一行兩個正整數n和m。

第二行n的整數表示這個數列。

接下來m行,每行開頭是乙個字元,若該字元為'm',則表示乙個修改操作,接下來三個整數x、y和z,表示在[x,y]這段區間的數改為z;若該字元為'q',則表示乙個詢問操作,接下來兩個整數x和y,表示求[x,y]這段區間的和。

輸出對每乙個詢問操作單獨輸出一行,表示答案。

樣例輸入

5 3

1 2 3 4 5

q 1 5

m 2 3 2

q 3 5

樣例輸出

15

11

提示

1<=n<=10^5,1<=m<=10^5,輸入保證合法,且所有整數及答案可用帶符號32位整型儲存。

對於線段樹的直接修改,

我們首先考慮要維護乙個修改標記,

注意這個標記是可以每次被覆蓋的!

然後值直接區間修改就好

1 #include2 #include3 #include4

#define ls k<<1

5#define rs k<<1|1

6using

namespace

std;

7const

int maxn=100001;8

const

int maxn=0x7ffff;9

void read(int &n)

1013

while(c>='

0'&&c<='9'

)14 x=(x<<1)+(x<<3)+c-48,c=getchar();

15 flag==1?n=-x:n=x;16}

17int

n,m;

18int ans=0;19

struct

node

2027 }tree[maxn<<2

];28

void update(int

k)29

32void build(int ll,int rr,int

k)33

40int mid=(ll+rr)>>1;41

build(ll,mid,ls);

42 build(mid+1

,rr,rs);

43update(k);44}

45void push(int

k)46

54void change(int k,int wl,int wr,int

v)55

64int mid=(tree[k].l+tree[k].r)>>1;65

if(tree[k].f!=-maxn)

66push(k);

67change(ls,wl,wr,v);

68change(rs,wl,wr,v);

69update(k);70}

71void ask(int k,int wl,int

wr)72

80int mid=(tree[k].l+tree[k].r)>>1;81

if(tree[k].f!=-maxn)

82push(k);

83ask(ls,wl,wr);

84ask(rs,wl,wr);

85update(k);86}

87int

main()

88102

else

103108

}109

return0;

110}

11112: challenge 5最近的提交

線段樹練習5

閒話 今天調了一天的線段樹,結果一下午一道題都沒做qaq,現在一看到 就眼疼。感覺要很久才能恢復過來orz 不過這個題對於線段樹來說應該是個很好的模板題2333 有n個數和5種操作 add a b c 把區間 a,b 內的所有數都增加c set a b c 把區間 a,b 內的所有數都設為c sum...

4927 線段樹練習5

4927 線段樹練習5 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 檢視執行結果 題目描述 description 有n個數和5種操作 add a b c 把區間 a,b 內的所有數都增加c set a b c 把區間 a,b 內的所有數都設為c sum a b 查詢區...

4927 線段樹練習5

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 有n個數和5種操作 add a b c 把區間 a,b 內的所有數都增加c set a b c 把區間 a,b 內的所有數都設為c sum a b 查詢區間 a,b 的區間和 max a b 查詢區間 a,b 的最...