发布题解

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;
}

评论: