CCF CSP 2020-12 T5 星際旅行 (動(dòng)態(tài)開點(diǎn)線段樹維護(hù)矩陣)
2021-12-01 10:31 作者:昵稱不能為空voidf | 我要投稿
大意:您需要寫一個(gè)數(shù)據(jù)結(jié)構(gòu)維護(hù)一個(gè)三元組數(shù)組,支持以下四種操作:
1、區(qū)間中的所有三元組的每個(gè)分量分別加上a,b,c
2、區(qū)間中的所有三元組的每個(gè)分量分別乘以k
3、區(qū)間中的所有三元組從{x, y, z}旋轉(zhuǎn)為{y, z, x}
4、查詢區(qū)間中的所有三元組的各分量和的平方再求和
其中1、2、4是線段樹基本操作,3則可以通過矩陣乘法進(jìn)行初等變換來解決。
樹上每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)這樣的矩陣:
分別表示區(qū)間x、y、z的和。操作1可以用相同類型矩陣打tag相加。
操作2: 左乘
操作3:左乘
因?yàn)榫仃嚦朔ㄓ薪Y(jié)合律,所以標(biāo)記可以合并從而保證單次操作復(fù)雜度。但是會(huì)帶一個(gè)
的矩陣乘法常數(shù),也可以把加法換成1*3的矩陣稍微優(yōu)化一下。
還有一種維護(hù)方法是維護(hù)4*4的齊次矩陣,就可以把加法變成乘法,于是只需要乘法標(biāo)記,簡(jiǎn)化掉雙標(biāo)記線段樹的麻煩。
惡心的地方:n<=1e9
于是需要?jiǎng)討B(tài)開點(diǎn)。試了下珂朵莉樹,由于沒有區(qū)間賦值,發(fā)現(xiàn)1e4內(nèi)還可以0.76s,4e4暴漲到86s導(dǎo)致TLE
通過代碼:
https://paste.ubuntu.com/p/s5F4vj2w5t/

標(biāo)簽: