题意:

小A有一个含有n个非负整数的数列与m个区间。每个区间可以表示为l{i},r{i}li,ri。

它想选择其中kk个区间, 使得这些区间的交的那些位置所对应的数的和最大。

数据范围:1<=n<=1e5,1<=k<=m<=1e5

解题思路:

先根据左端点从小到大对区间排序,枚举每个区间的左端点当成交的左端点,对于右端点,选择的是左端点比交的左端点小的区间,把它们的右端点放入线段树,注意前k-1个区间是不用枚举左端点的,然后再对于每个确定的交的左端点找第k大的右端点即为该区间。

注意:res的初始值应该是0,因为存在找不到的情况。

int query1(int id,int x)//查询区间第k大
{
    int l=node[id].left;
    int r=node[id].right;
    if(l==r)
        return l;
    if(node[id<<1|1].val>=x)//优先从右树中找满足条件的
        return query1(id<<1|1,x);
    else//右边不够剩下的点从左树找
        return query1(id<<1,x-node[id<<1|1].val);
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

HDU 5695 拓扑排序+优先队列 Previous
51nod 1449 砝码称重 Next