1 条题解

  • 0
    @ 2026-5-5 2:18:24
    #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
    上传者