code forces1249D Too Many Segments

大佬连接::https://blog.csdn.net/weixin_43847416/article/details/102749985

题意::删除最少数量的区段使每个整数点的覆盖次数不大于K

思路::

以区间左端点为头,右端点由小到大排序,如果端点相同,按标号存入。

从头开始遍历每个点,判断每个点上覆盖次数,大于k时删除最长的那个区间。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int maxn=2e5+5;
 5 struct node{
 6     int r,index;
 7     node(){}
 8     node (int  rr,int ii ):r(rr),index(ii){}
 9     bool operator < (const node &rh)const{
10         if(r==rh.r){return index<rh.index;}
11         else{return r<rh.r;}
12     }
13 };
14 vector<int>ans;
15 vector<node>p[maxn];
16 
17 int main()
18 {
19     int n,k,a,b;
20     scanf("%d%d",&n,&k);
21     for(int i=1;i<=n;i++){
22         scanf("%d%d",&a,&b);
23         p[a].push_back(node(b,i));
24     }
25     set<node>s;
26     for(int i=1;i<maxn;i++){
27         while(s.size()&&(*s.begin()).r<i){s.erase(*s.begin());}
28         for(int j=0;j<p[i].size();j++){
29             s.insert(p[i][j]);
30         }
31         while(s.size()>k){
32             ans.push_back((*s.rbegin()).index);
33             s.erase(*s.rbegin());
34         }
35     }
36     int len=ans.size();
37     printf("%d\n",len);
38     for(int i=0;i<len;i++){
39         printf("%d ",ans[i]);
40     }
41     return 0;
42 }

 

posted @ 2019-11-07 22:44  sj-_-js  阅读(147)  评论(0编辑  收藏  举报