题意:
小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 协议 ,转载请注明出处!