当前位置:   article > 正文

扫描线 牛客练习赛124_PLUS_C_牛客练习赛124题解

牛客练习赛124题解

题目链接

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int N=1e6+10;
  5. int n,k,m,t[N],l[N],r[N];
  6. vector<int> g[N];
  7. priority_queue<int,vector<int>,greater<int>> q;
  8. signed main(){
  9. scanf("%d%d%d",&n,&m,&k);
  10. for(int i=1;i<=n;i++){
  11. scanf("%d%d",&l[i],&r[i]),t[i]=r[i];
  12. }
  13. sort(t+1,t+n+1);//按右端点排序
  14. for(int i=1;i<=n;i++){
  15. int x=lower_bound(t+1,t+n+1,r[i])-t;//找到第一个大于等于r[i]的下标
  16. g[x].push_back(l[i]); //>=r[i]包含的左端点
  17. }
  18. ll ans=0;t[n+1]=m+1;
  19. for(int i=1;i<=n;i++){
  20. for(int x:g[i])q.push(x);//q相当于小根堆,左端点单调不降
  21. while(q.size()>k)q.pop();
  22. //q.top()左边区间的贡献
  23. //t[i]~t[i+1]区间的贡献,不包括t[i+1]点
  24. if(q.size()==k)ans+=1ll*(t[i+1]-t[i])*(q.top());
  25. }
  26. printf("%lld\n",ans);
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/523539
推荐阅读
相关标签
  

闽ICP备14008679号