1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include<bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,a,b) for(int i=a,i##end=b;i<=i##end;++i) #define drep(i,a,b) for(int i=a,i##end=b;i>=i##end;--i)
const int N=110;
int n; int a[N]; int cnt[N]; int L[N],R[N],m,Cross[N][N]; int vec[2][N],c[2];
struct Edge{ int u,v,nxt; }e[N*10]; int head[N],ecnt; void AddEdge(int u,int v) { e[++ecnt]=(Edge){u,v,head[u]}; head[u]=ecnt; } void Link(int u,int v){ AddEdge(u,v),AddEdge(v,u); } void Back(){ head[e[ecnt].u]=e[ecnt].nxt,ecnt--; head[e[ecnt].u]=e[ecnt].nxt,ecnt--; }
int ans,fl; int vis[N]; void dfs_col(int u,int c){ vis[u]=c; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].v; if(!vis[v]) dfs_col(v,3-c); else if(vis[v]==vis[u]) fl=0; } }
void dfs(int p) { if(ans) return; if(p>m){ rep(i,0,n*2+1) vis[i]=0; fl=1; rep(i,0,n*2+1) if(!vis[i]) dfs_col(i,1); ans|=fl; return; } rep(i,0,1){ int fl=1; rep(j,1,c[i]) if(R[vec[i][j]]>L[p] && R[vec[i][j]]<R[p]) fl=0; if(!fl) continue; vec[i][++c[i]]=p; if(i || ~(cnt[R[p]]-cnt[L[p]])&1) Link(L[p]+n+1,R[p]-1); else Link(L[p],R[p]-1); dfs(p+1); c[i]--,Back(); } }
class DisjointSemicircles { public: string getPossibility(vector <int> labels) { n=labels.size(),m=0; rep(i,1,n) a[i]=labels[i-1]; rep(i,1,n) { cnt[i]=cnt[i-1]+(a[i]==-1); if(~a[i]) rep(j,i+1,n) if(a[j]==a[i]) L[++m]=i,R[m]=j; } if(!m) return "POSSIBLE"; rep(i,0,(n+1)*2) head[i]=ecnt=0; rep(i,1,n) if(~a[i]) Link(i+n+1,i-1); rep(i,0,n) Link(i,i+n+1); Link(n+1,n); ans=0,dfs(1); return ans?"POSSIBLE":"IMPOSSIBLE"; } };
|