题意
     一开始想到用二维线段树,但是我没写过二维的,只写过一维的。后来问了下别人,说一维也行(一开始我也想到是不是可以用一维的,但是很快就被我自己给否定了,我认为那样时间会不够的,后来再第11个点还真的不够)。于是就写了一个一维的线段树。把每一行进行一次线段树操作。这样空间也可以开出来,变成复杂度也不高。可是交上去之后在第11个点超时了。给的是2S,我的运行了2.67S。有人说可以从后往前染色,那样的话,如果某个区域已经染色了,那么后面就不用在染色了,因为在染色是没有意义的。无奈不会实现,想着用并查集稍微加速下,可是发现不怎么好合并(哪位高人看了给指点指点,看到一牛人写了点,不过由于水平问题,实在不知并查集怎么实现这个问题的),于是一直TLE,今天看了nocow的题解,发现基本是用矩形切割做的.推荐看薛茅的论文,开始对这个东西我还一无所知。终于在那看到个线段树的,第11组数据也只有0.7S。后来看了下,发现那个程序也是用一维的线段树搞的,不过比我的实现的好,首先不是每一行都进行一次线段树操作,那样时间肯定是不够的。我们来看下面这幅图,
图中的黑色框是原矩形,红色的是我们投影的那些值(这里没有画大矩形的两条边)。
我们首先对垂直X轴的边投影(其中包括原来大矩形的两条边),得到一些列的值,那么以后只要对这些值中相邻的两个之间(图中的红色线条之间的区域)进行一次线段树的操作这样的话可以减少不少的操作,也就是说原来的一行进行一次,可以把某些行进行合并,因为这些行(每两条相邻的红色线段之间的行)的颜色都一样的。这样操作之后最大一组数据用时0.7S.
似乎这题的标准解法是矩形切割。到时再去看看。

下面再看看矩形切割的方法。(代码不是我的。官方的,我只加了点注释)
直接上代码
下面的一个图贴在代码里面会乱,在这贴下吧(我无语了,还是会乱,只好截图了)

 

CODE