做法问题

P1963 [NOI2009] 变换序列

这是我的代码 ```cpp #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=11000; struct node { int to; int next; }; node e[2*N]; int head[N],ans[N],etot; void add(int x,int y) { etot++; e[etot].to=y; e[etot].next=head[x]; head[x]=etot; } void read(int &x) { int f; f=1; x=0; char c; c=getchar(); while((c<'0'||c>'9')&&c!='-') { c=getchar(); } if(c=='-') { f=-1; c=getchar(); } while(c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); } x=x*f; } int d[N]; struct node2 { int fr; int to; }; node2 e2[10]; int e2tot,vis[2*N],match[2*N]; bool cmp(const node2& x1,const node2& x2) { return x1.fr==x2.fr ? x1.to>x2.to : x1.fr<x2.fr; } bool dfs(int x) { int i,v; for(i=head[x];i!=0;i=e[i].next) { v=e[i].to; if(!vis[v]) { vis[v]=1; if(!match[v]||dfs(match[v])) { match[v]=x; ans[x]=v; return 1; } } } return 0; } int main() { int n,i,x,y,z,xx,j; read(n); for(i=1;i<=n;i++) { read(d[i]); } for(i=1;i<=n;i++) { x=d[i]+(i-1); e2tot=0; if(x>=0&&x<=n-1&&x-i+1<=n/2&&x>=i-1) { e2tot++; e2[e2tot].fr=i; e2[e2tot].to=x+n+1; } else { x=-1; } y=(i-1)-d[i]; if(y>=0&&y<=n-1&&y!=x&&i-1-y<=n/2&&y<=i-1) { e2tot++; e2[e2tot].fr=i; e2[e2tot].to=y+n+1; } else { y=-1; } z=(i-1)+d[i]-n; if(z>=0&&z<=n-1&&z!=x&&z!=y&&i-1-z>n/2&&z<=i-1) { e2tot++; e2[e2tot].fr=i; e2[e2tot].to=z+n+1; } else { z=-1; } xx=n+(i-1)-d[i]; if(xx>=0&&xx<=n-1&&xx!=x&&xx!=y&&xx!=z&&xx-i+1>n/2&&xx>=i-1) { e2tot++; e2[e2tot].fr=i; e2[e2tot].to=xx+n+1; } else { xx=-1; } sort(e2+1,e2+1+e2tot,cmp); for(j=1;j<=e2tot;j++) { add(e2[j].fr,e2[j].to); } } for(i=n;i>=1;i--) { memset(vis,0,sizeof(vis)); vis[i]=1; if(!dfs(i)) { printf("No Answer"); return 0; } } for(i=1;i<=n;i++) { printf("%d ",ans[i]-1-n); } } ```
by szr666 @ 2019-08-24 11:45:32


|