Loading

AT_arc186_a [ARC186A] Underclued

这题赛时想到从图的角度考虑,完全没想到这么搞二分图啊!

我们构造二分图进行思考。当 Ai,j=1 时,将左部 i 向右部 j 连边,当 Ai,j=0 时,将右部 i 向左部 j 连边,那么两图相似显然要满足每个点出度入度相同,那么什么边可以改变呢?注意到只要我们能够在这张图中找到一个简单环,然后我们把这些边全部转向就可以造出一张新的相似的图。而对于另外的边,我们动不了。

然后,我们考虑怎么利用这个性质。我们可以利用 dp,每次给图加入一个强连通分量,那么里面的边全都可以动,直接暴力 O(n6) 枚举转移即可。可以使用 bitset 优化,那么时间复杂度是 O(n6w)

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
#define rrp(i, l, r) for (int i = r; i >= l; -- i)
#define pii pair <int, int>
#define eb emplace_back
#define ls p << 1
#define rs ls | 1
using namespace std;
constexpr int N = 30 + 5, B = 71, P = 1042702009;
typedef unsigned long long ull;
inline int rd () {
  int x = 0, f = 1;
  char ch = getchar ();
  while (! isdigit (ch)) {
    if (ch == '-') f = -1;
    ch = getchar ();
  }
  while (isdigit (ch)) {
    x = (x << 1) + (x << 3) + ch - 48;
    ch = getchar ();
  }
  return x * f;
}
int qpow (int x, int y) {
  int ret = 1;
  for (; y; y >>= 1, x = x * x % P) if (y & 1) ret = ret * x % P;
  return ret;
}
int n, q;
bitset <901> dp[N][N];
signed main () {
  // freopen ("1.in", "r", stdin);
  // freopen ("1.out", "w", stdout);
  n = rd (), q = rd ();
  dp[0][0][0] = 1;
  rep (X, 1, n) rep (Y, 1, n) rep (x, 0, X - 2) rep (y, 0, Y - 2) dp[X][Y] |= dp[x][y] << ((X - x) * (Y - y));
  bitset <901> sum;
  rep (x, 0, n) rep (y, 0, n) sum |= dp[x][y];
  for (; q; -- q) {
    int x = rd ();
    puts (sum[n * n - x] ? "Yes" : "No");
  }
}

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18546045

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示