扫描线 牛客练习赛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);
}
相关推荐
fufu03119 小时前
Linux环境下的C语言编程(四十八)
数据结构·算法·排序算法
Yingye Zhu(HPXXZYY)9 小时前
Solution to Luogu P6340
算法
小熳芋9 小时前
单词搜索- python-dfs&剪枝
算法·深度优先·剪枝
Xの哲學9 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
oioihoii9 小时前
跨越进程的对话之从管道到gRPC的通信技术演进
c++
bu_shuo9 小时前
MATLAB中的转置操作及其必要性
开发语言·算法·matlab
高洁0110 小时前
图神经网络初探(2)
人工智能·深度学习·算法·机器学习·transformer
爱装代码的小瓶子10 小时前
算法【c++】二叉树搜索树转换成排序双向链表
c++·算法·链表
思成Codes10 小时前
数据结构:基础线段树——线段树系列(提供模板)
数据结构·算法
阳洞洞10 小时前
cmake中如何从include_directories中移除某个特定的头文件
c++·cmake