按右端点排序。因为我们尽量选用重合最多的点。而最左边的右端点相对于这一段是最好的,因为他可能的重合数最多,因为越往右,接触到的线段越多,重复数也越多。
因此对右端点排序,然后从一段右端点向左端点扫描,标记。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int inf=10001;
typedef pair<int,int> PII;
vector<PII>v;
vector<int>ans;
int n,U,V,tot,k;
int used[20002];
bool cp1(PII x,PII y)
{
return x.first<y.first;
}
bool cp2(int x,int y)
{
return x<y;
}
int main()
{
cin>>k>>n;
for(int i=1;i<=n;i++)
{
cin>>U>>V;
v.push_back(make_pair(max(U,V),min(U,V)));
}
sort(v.begin(),v.end(),cp1);
for(int i=0;i<v.size();i++)
{
int l=v[i].second;
int r=v[i].first;
int need=k;
for(int i=r;i>=l;i--)
{
if(used[i+inf])
{
need--;
}
}
for(int i=r;i>=l;i--)
{
if(need<=0)
break;
if(used[i+inf])
continue;
used[i+inf]=1;
tot++;
need--;
ans.push_back(i);
}
}
sort(ans.begin(),ans.end(),cp2);
cout<<tot<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<endl;
return 0;
}