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

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

 

CODE