題意
     一開始想到用二維線段樹,但是我沒寫過二維的,只寫過一維的。后來問了下別人,說一維也行(一開始我也想到是不是可以用一維的,但是很快就被我自己給否定了,我認(rèn)為那樣時(shí)間會(huì)不夠的,后來再第11個(gè)點(diǎn)還真的不夠)。于是就寫了一個(gè)一維的線段樹。把每一行進(jìn)行一次線段樹操作。這樣空間也可以開出來,變成復(fù)雜度也不高。可是交上去之后在第11個(gè)點(diǎn)超時(shí)了。給的是2S,我的運(yùn)行了2.67S。有人說可以從后往前染色,那樣的話,如果某個(gè)區(qū)域已經(jīng)染色了,那么后面就不用在染色了,因?yàn)樵谌旧菦]有意義的。無奈不會(huì)實(shí)現(xiàn),想著用并查集稍微加速下,可是發(fā)現(xiàn)不怎么好合并(哪位高人看了給指點(diǎn)指點(diǎn),看到一牛人寫了點(diǎn),不過由于水平問題,實(shí)在不知并查集怎么實(shí)現(xiàn)這個(gè)問題的),于是一直TLE,今天看了nocow的題解,發(fā)現(xiàn)基本是用矩形切割做的.推薦看薛茅的論文,開始對(duì)這個(gè)東西我還一無所知。終于在那看到個(gè)線段樹的,第11組數(shù)據(jù)也只有0.7S。后來看了下,發(fā)現(xiàn)那個(gè)程序也是用一維的線段樹搞的,不過比我的實(shí)現(xiàn)的好,首先不是每一行都進(jìn)行一次線段樹操作,那樣時(shí)間肯定是不夠的。我們來看下面這幅圖,
圖中的黑色框是原矩形,紅色的是我們投影的那些值(這里沒有畫大矩形的兩條邊)。
我們首先對(duì)垂直X軸的邊投影(其中包括原來大矩形的兩條邊),得到一些列的值,那么以后只要對(duì)這些值中相鄰的兩個(gè)之間(圖中的紅色線條之間的區(qū)域)進(jìn)行一次線段樹的操作這樣的話可以減少不少的操作,也就是說原來的一行進(jìn)行一次,可以把某些行進(jìn)行合并,因?yàn)檫@些行(每兩條相鄰的紅色線段之間的行)的顏色都一樣的。這樣操作之后最大一組數(shù)據(jù)用時(shí)0.7S.
似乎這題的標(biāo)準(zhǔn)解法是矩形切割。到時(shí)再去看看。

下面再看看矩形切割的方法。(代碼不是我的。官方的,我只加了點(diǎn)注釋)
直接上代碼
下面的一個(gè)圖貼在代碼里面會(huì)亂,在這貼下吧(我無語了,還是會(huì)亂,只好截圖了)

 

CODE