扫描线 牛客练习赛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);
}
相关推荐
黎雁·泠崖16 小时前
吃透指针通用用法:回调函数与 qsort 的使用和模拟
c语言·开发语言
脏脏a16 小时前
聊聊 C 里的进制转换、移位操作与算术转换
c语言·开发语言·移位操作符
xie_pin_an16 小时前
深入解析 C 语言排序算法:从快排优化到外排序实现
c语言·算法·排序算法
陳103016 小时前
C++:string(4)
开发语言·c++
Hcoco_me16 小时前
机器学习核心概念与主流算法(通俗详细版)
人工智能·算法·机器学习·数据挖掘·聚类
Hcoco_me16 小时前
嵌入式场景算法轻量化部署checklist
算法
咸鱼加辣16 小时前
【python面试】Python 的 lambda
javascript·python·算法
Jerryhut16 小时前
sklearn函数总结十二 —— 聚类分析算法K-Means
算法·kmeans·sklearn
inputA16 小时前
【rt-thread】点灯实验和按键输入实验
c语言·笔记·学习·实时操作系统
Swift社区16 小时前
LeetCode 453 - 最小操作次数使数组元素相等
算法·leetcode·职场和发展