 /**//*
题意:n张等高的纸,每张纸有一条线,每张纸能旋转180°
问能否将全部纸凑起来,那些线段成一条
其实很简单的
对每张纸,建多一个旋转之后的纸
然后排序,排序规则按照原本是升的就升,降的就降
最后统计一下能拼在一起的个数是否为n
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;

const int MAXN = 50000;

struct Strip
  {
int a,b,id;
}strips[MAXN*2+10];

bool vi[MAXN+10];
int ans[MAXN+10];

bool cmp(const Strip &a,const Strip &b)
  {
if(a.a>a.b)return a.a>b.a;
return a.a<b.a;
}
int main()
  {
//freopen("in","r",stdin);
int h,n;
while(~scanf("%d%d",&h,&n))
 {
int w,line=true;
for(int i=1;i<=n;i++)
 {
scanf("%d%d",&strips[i].a,&strips[i].b);
strips[i].id=i;
strips[i+n].a=h-strips[i].b;
strips[i+n].b=h-strips[i].a;
strips[i+n].id=-i;
if(i==1)w=strips[i].a-strips[i].b;
else if(w!=strips[i].a-strips[i].b)line=false;
}
 if(!line) {puts("0");continue;}
sort(strips+1,strips+1+2*n,cmp);
memset(vi,0,sizeof(vi));
int cnt=0,y=strips[1].a;
for(int i=1;i<=2*n;i++)
 {
if(vi[abs(strips[i].id)])continue;
if(y==strips[i].a)
 {
ans[++cnt]=strips[i].id;
y=strips[i].b;
vi[abs(strips[i].id)]=1;
}
}
if(cnt<n)puts("0");
else
 {
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
puts("");
}
}
return 0;
}

|
|
常用链接
随笔分类
Links
搜索
最新评论

|
|