2019牛客暑期多校训练营(第五场)F maximum clique 1 二分图求最大独立集
https://ac.nowcoder.com/acm/contest/885/F
#include <bits/stdc++.h> //CLOCKS_PER_SEC #define se second #define fi first #define ll long long #define Pii pair<int,int> #define Pli pair<ll,int> #define ull unsigned long long #define pb push_back #define ALL(x) x.begin(),x.end() #define fio ios::sync_with_stdio(false);cin.tie(0); #define lowbit(x) (x&(-x)) #define db double #define N 5010 const double Pi=3.14159265; //const int N=2e6+10; const ull base=163; const int INF=0x3f3f3f3f; const int mod=1e9+7; const db eps=1e-10; const db pi=acos(-1); using namespace std; int a[5008]; int n; int cy[N],cx[N]; bool ev[N],f[N],mt[N]; struct node{ int to,nxt; }g[N*1000]; int head[N],cnt; void add(int u,int v){ g[cnt].to=v; g[cnt].nxt=head[u]; head[u]=cnt++; } bool check(int x,int y){ int k=0; while(x||y){ if((x&1)!=(y&1)){ k++; } x>>=1; y>>=1; } return k<=1; } bool dfs(int u){ for(int i=head[u];i!=-1;i=g[i].nxt){ if(!f[g[i].to]){ f[g[i].to]=1; if(!cy[g[i].to]||dfs(cy[g[i].to])){ cx[u]=g[i].to; cy[g[i].to]=u; return 1; } } } return 0; } void dfs2(int u){ mt[u]=1; for(int i=head[u];i!=-1;i=g[i].nxt){ if(!f[g[i].to]){ f[g[i].to]=1; if(cx[g[i].to]&&cx[g[i].to]!=u){ mt[g[i].to]=1; dfs2(cx[g[i].to]); } } } return ; } int ans[N]; int main(){ memset(head,-1,sizeof(head)); scanf("%d",&n); int k,x; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); x=a[i]; k=0; while(x){ if(x&1){ k++; } x>>=1; } if(k&1){ ev[i]=1; } for(int j=1;j<i;j++){ if(check(a[i],a[j])){ add(i,j); add(j,i); } } } for(int i=1;i<=n;i++){ if(ev[i]){ memset(f,0,sizeof(f)); dfs(i); } } for(int i=1;i<=n;i++){ if(!ev[i]&&!cy[i]){ memset(f,0,sizeof(f)); dfs2(i); } } int tot=0; for(int i=1;i<=n;i++){ if(ev[i]!=mt[i]){ ans[++tot]=a[i]; } } printf("%d\n",tot); for(int i=1;i<tot;i++){ printf("%d ",ans[i]); } printf("%d\n",ans[tot]); return 0; }