https://vjudge.net/problem/CodeForces-1249D2
题解:贪心算法,从前往后找发现每个点大于k那么就删掉覆盖该点所有线段上结束点最靠右的的线段即可
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct node{
int s,e,id;
} p[N];
int cmp(node a,node b){
return a.s<b.s;
}
vector<int> ans;
set<pair<int,int> > all;
int main(){
int n,k;
cin>>n>>k;
int max_n=0,min_n=N;
pair<int,int> t;
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].s,&p[i].e);
p[i].id=i;
max_n=max(max_n,p[i].e);
min_n=min(min_n,p[i].s);
}
sort(p+1,p+1+n,cmp);
int pos=1;
for(int i=min_n;i<=max_n;++i){
while(pos<=n&&p[pos].s<=i){
all.insert(make_pair(p[pos].e,p[pos].id));
pos++;
}
while(all.size()&&all.begin()->first<i){
all.erase(all.begin()); //默认排序从小到大
}
while(all.size()>k){
t=*(--all.end());
ans.push_back(t.second);
all.erase(t);
}
}
sort(ans.begin(),ans.end());
cout<<ans.size()<<endl;
for(int i=0;i<(int)ans.size();i++)
cout<<ans[i]<<' ';
return 0;
}