seanlsy • 2年前
#include <bits/stdc++.h>
using namespace std;
int t,k,n,a,b,ans[20010];
bool vis[20010];//是否安装广告
pair<int,int> p[1005];//second左端点,left右端点
int main(){
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
int cnt=0;//统计总安装广告数
cin>>k>>n;
for(int i=1;i<=n;i++)
cin>>a>>b,p[i].second=min(a,b)+10000,p[i].first=max(a,b)+10000;//离散化(这题有坑,左端点可能比右端点大)
sort(p+1,p+n+1);//按右端点优先排序
for(int i=1;i<=n;i++){
int sum=0;
for(int j=p[i].second;j<=p[i].first;j++)
sum+=vis[j];
if(sum<k)//统计该区间广告数是否足够
for(int j=p[i].first;j>=p[i].second&&sum<k;j--)//从右到左安装广告
if(!vis[j])
vis[j]=1,sum++,ans[++cnt]=j;
}
sort(ans+1,ans+cnt+1);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
cout<<ans[i]-10000<<endl;
}
return 0;
}
评论: