贪心,用类似刘汝佳书上的办法就能解决。
注意输入数据不一定是按照大小顺序。
</pre><pre name="code" class="cpp">#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define MAX 1010
#define LENGTH 10100
using namespace std;
struct region
{
int a,b;
}re[MAX];
int cmp(const void *p,const void *q)
{
if(((struct region*)p)->b<((struct region*)q)->b)
return -1;
else if(((struct region*)p)->b==((struct region*)q)->b)
{
if(((struct region*)p)->a>((struct region*)q)->a)
return -1;
}
else
return 1;
}
char map[LENGTH*2];
int main()
{
int t,k,n,i,j,a,b,have,all;
scanf("%d",&t);
while(t--)
//while(scanf("%d %d",&k,&n)!=EOF)
{
scanf("%d %d",&k,&n);
memset(map,0,LENGTH*2);
all=0;
for(i=0;i<n;i++)
{
scanf("%d %d",&a,&b);
a+=LENGTH,b+=LENGTH;
if(a<=b)
{
re[i].a=a;
re[i].b=b;
}
else
{
re[i].a=b;
re[i].b=a;
}
}
qsort(re,n,sizeof(re[0]),cmp);
for(i=0;i<n;i++)
{
have=0;
for(j=re[i].b;j>=re[i].a;j--)
{
if(map[j]==1)
have++;
}
for(j=re[i].b;have<k&&j>=re[i].a;j--)
{
if(map[j]==1)
continue;
map[j]=1;
all++;
have++;
}
}
printf("%d\n",all);
for(i=0;i<LENGTH*2;i++)
if(map[i])
printf("%d\n",i-LENGTH);
if(t)
printf("\n");
}
return 0;
}