扫描线 牛客练习赛124_PLUS_C

题目链接

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
int n,k,m,t[N],l[N],r[N];
vector<int> g[N];
priority_queue<int,vector<int>,greater<int>> q;
signed main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&l[i],&r[i]),t[i]=r[i];
	}
	sort(t+1,t+n+1);//按右端点排序
	for(int i=1;i<=n;i++){
		int x=lower_bound(t+1,t+n+1,r[i])-t;//找到第一个大于等于r[i]的下标
		g[x].push_back(l[i]); //>=r[i]包含的左端点
	}
	ll ans=0;t[n+1]=m+1;
	for(int i=1;i<=n;i++){
		for(int x:g[i])q.push(x);//q相当于小根堆,左端点单调不降
		while(q.size()>k)q.pop();
        //q.top()左边区间的贡献
        //t[i]~t[i+1]区间的贡献,不包括t[i+1]点
		if(q.size()==k)ans+=1ll*(t[i+1]-t[i])*(q.top());
	}
	printf("%lld\n",ans);
}
相关推荐
郭涤生4 分钟前
大白话Reactor模式
linux·c++
民乐团扒谱机4 分钟前
【微实验】谱聚类之大规模数据应用——Nyström 方法
人工智能·算法·机器学习·matlab·数据挖掘·聚类·谱聚类
CoderYanger6 分钟前
A.每日一题——3606. 优惠券校验器
java·开发语言·数据结构·算法·leetcode
CoderYanger16 分钟前
D.二分查找-基础——744. 寻找比目标字母大的最小字母
java·开发语言·数据结构·算法·leetcode·职场和发展
元亓亓亓19 分钟前
LeetCode热题100--347. 前 K 个高频元素--中等
数据结构·算法·leetcode
三月微暖寻春笋22 分钟前
【和春笋一起学C++】(五十)在构造函数中使用new时的注意事项
c++·new·构造函数
Hello eveybody23 分钟前
冒泡、选择、插入排序简介(C++)
数据结构·算法·排序算法
CoderYanger25 分钟前
贪心算法:2.将数组和减半的最少操作次数
java·算法·leetcode·贪心算法·1024程序员节
Chen--Xing27 分钟前
LeetCode 49.字母异位词分组
c++·python·算法·leetcode·rust
长安er31 分钟前
LeetCode 235 & 236 最近公共祖先(LCA)解题总结
算法·leetcode·二叉树·递归·lca