社区讨论

35pts只错#11#14求条

P11409西湖有雅座参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhz4holi
此快照首次捕获于
2025/11/15 01:19
4 个月前
此快照最后确认于
2025/11/16 13:59
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const int N = 1010;
int a[N], vis[N], c[2], mp[N][N], n;
void dfs(int p)
{
  c[vis[p]] ++;
  for (int i = 1; i <= n; i ++)
  {
    if (mp[i][p])
    {
      if (vis[i] == vis[p])
      {
        cout << -1 << endl;
        exit(0);
      }
      if (vis[i] == -1)
      {
        vis[i] = 1 - vis[p];
        dfs(i);
      }
    }
  }
}
signed main()
{
  cin.tie(0)->sync_with_stdio(0);
  int h, w;
  cin >> n >> h >> w;
  for (int k = 1; k <= n; k ++)
  {
    for (int i = 0; i < h; i ++)
      for (int j = 0; j < w; j ++)
      {
        int x;
        cin >> x;
        a[k] |= x << i * w + j;
      }
    //a[k] = ~a[k] & (1ll << h * w) - 1;
  }
  for (int i = 1; i <= n; i ++)
  {
    for (int j = 1; j < i; j ++)
    {
      if (__builtin_popcount(a[i] & a[j]) >= (min(__builtin_popcount(a[i]), __builtin_popcount(a[j])) + 1) / 2)
        mp[i][j] = mp[j][i] = 0;
      else
        mp[i][j] = mp[j][i] = 1;
    }
  }
  memset(vis, -1, sizeof(vis));
  int ans = 0;
  for (int i = 1; i <= n; i ++)
  {
    if (vis[i] == -1)
    {
      c[0] = 0, c[1] = 0;
      vis[i] = 0;
      dfs(i);
      ans += max(c[0], c[1]);
    }
  }
  cout << ans << endl;
  return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...