Codeforces Beta Round #75 Igloo Skyscraper



很不错的一道线段树的题目



在每个节点里面加个线性表,这是关键的操作!

线性表里面是这个节点的范围内,将它按照a数组从小到大排序,接着剔除掉a[i] >= a[j] 并且b[i] >= b[j]这种j

另外还要用到(a[x] - a[y])*(b[z]-b[y])<=(a[y] - a[z])*(b[y]-b[x),把这种y全部删除掉,保证线性表的单调性

接着查找的时候就可以用到二分,即可得出答案


至于时间复杂度

线段树每一层的线性表里面总共n个点,总共lgn层,每一层都有排序什么的,建树的时间复杂度是O(n lg^2 n)

另外查询有q次,每次递归找区间是lgn次,二分是lgn次,查询的时间是O(q lg ^2 n)

总的时间复杂度是O(n lg^2 n + q lg ^2 n)


还有一点,可以不使用二分,将时间点排序,接着的话,就是最多nlgn次





你可能感兴趣的:(ACM_数据结构)