 /**//*
題意: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
搜索
最新評論

|
|