1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n,m,k[1050000],pre[1050000],x[1050000]; int vis[1050000],col[1050000],cnt[2]; int dp[1050000],sum; vector<int> edge[1050000]; queue<int> qu; bitset<1005000> f; void dfs(int x) { vis[x]=1; cnt[col[x]]++; for (auto y:edge[x]) { if (vis[y]) continue; col[y]=col[x]^1; dfs(y); } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d",&k[i]); pre[i]=pre[i-1]+k[i]; for (int j=pre[i-1]+1;j<=pre[i];j++) { scanf("%d",&x[j]); if (j!=pre[i-1]+1) { edge[x[j-1]].push_back(x[j]); edge[x[j]].push_back(x[j-1]); } } } for (int i=1;i<=n;i++) { if (vis[i]==0) { dfs(i); if (cnt[0]>cnt[1]) dp[cnt[0]-cnt[1]]++; if (cnt[1]>cnt[0]) dp[cnt[1]-cnt[0]]++; cnt[0]=cnt[1]=0; } } for (int i=1;i<=n;i++) { for (auto j:edge[i]) { if (col[i]==col[j]) { printf("impossible\n"); return 0; } } } for (int i=1;i<=n;i++) { if (dp[i]>=3) { dp[i*2]+=(dp[i]-1)/2; dp[i]-=(dp[i]-1)/2*2; } } for (int i=1;i<=n;i++) sum+=dp[i]*i; f[0]=1; for (int i=1;i<=sum/2;i++) { for (int j=0;j<dp[i];j++) { f|=(f<<(i*2)); } } for (int i=sum;i>=0;i--) { if (f[i]) { printf("%d\n",sum-i); return 0; } } printf("%d\n",sum); return 0; }
- 1
信息
- ID
- 10564
- 时间
- 1500ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者