这周做了一些有关线段树的练习,和复习了一下其他算法。这周不知道说啥,就直接放点题吧
Codeforces 612D
题意是给定一组线段,求最后重叠了k以上的点。这题可以不用线段树也很好做。但如果是用线段树的话,可以先维护两个线段树,进行点的覆盖和区间的覆盖,等到所有操作接受pushdown一串,然后扫描线段输出即可。
Codeforces 12D
给N (N<=500000)个点,每个点有x,y,z ( 0<= x,y,z <=10^9 )
对于某点(x,y,z),若存在一点(x1,y1,z1)使得x1 > x && y1 > y && z1 > z 则点(x,y,z)是特殊点。
问N个点中,求特殊点个数。
先离线处理所有点。然后对所有点按z,y,z降序排序。线段树中,存的是所有 z > Z 的点,叶节点存下每个x上的最大y,然后线段树维护区间最大值。
逆序处理,用并查集每次添加一个集合,同时判断这个数有没有相邻集合,有就合并。同时加上相邻集合的和 。最后得到结果,写的时候不太好想到并查集的解法。