總時間限制:
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 的最...