题解:P14595 [COCI 2025/2026 #2] 集训 / Dodatna
题目大意
给定
思路
我们需要找到最大的
如果按照左端点对学生排序,那么对于每个候选的
步骤
按左端点排序,用最小堆维护右端点,当堆大小达到k时,用堆顶最小右端点计算区间长度并更新最大值。
赛时代码
#include<bits/stdc++.h>
using namespace std;
pair<int,int>a[300078];
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
sort(a+1,a+n+1);
priority_queue<int,vector<int>,greater<int>> pq;
long long ans=0;
for(int i=1;i<=n;i++){
pq.push(a[i].second);
if(pq.size()>k) pq.pop();
if(pq.size()==k){
int ed=pq.top();
if(ed>a[i].first) ans=max(ans,(long long)ed-a[i].first);
}
}
cout<<ans;
return 0;
}//按左端点排序,用最小堆维护右端点,当堆大小达到k时,用堆顶最小右端点计算区间长度并更新最大值。