QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#662731#9449. New School TermcaijianhongWA 0ms3812kbC++203.3kb2024-10-21 09:38:042024-10-21 09:38:05

Judging History

你现在查看的是最新测评结果

  • [2024-10-21 09:38:05]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3812kb
  • [2024-10-21 09:38:04]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define endl "\n"
#define debug(...) void(0)
#endif
using LL = long long;
template <unsigned umod>
struct modint {/*{{{*/
  static constexpr int mod = umod;
  unsigned v;
  modint() = default;
  template <class T, enable_if_t<is_integral<T>::value, int> = 0>
    modint(const T& y) : v((unsigned)(y % mod + (is_signed<T>() && y < 0 ? mod : 0))) {}
  modint& operator+=(const modint& rhs) { v += rhs.v; if (v >= umod) v -= umod; return *this; }
  modint& operator-=(const modint& rhs) { v -= rhs.v; if (v >= umod) v += umod; return *this; }
  modint& operator*=(const modint& rhs) { v = (unsigned)(1ull * v * rhs.v % umod); return *this; }
  modint& operator/=(const modint& rhs) { assert(rhs.v); return *this *= qpow(rhs, mod - 2); }
  friend modint operator+(modint lhs, const modint& rhs) { return lhs += rhs; }
  friend modint operator-(modint lhs, const modint& rhs) { return lhs -= rhs; }
  friend modint operator*(modint lhs, const modint& rhs) { return lhs *= rhs; }
  friend modint operator/(modint lhs, const modint& rhs) { return lhs /= rhs; }
  template <class T> friend modint qpow(modint a, T b) {
    modint r = 1;
    for (assert(b >= 0); b; b >>= 1, a *= a) if (b & 1) r *= a;
    return r;
  }
  friend int raw(const modint& self) { return self.v; }
  friend ostream& operator<<(ostream& os, const modint& self) { return os << raw(self); }
  explicit operator bool() const { return v != 0; }
};/*}}}*/
using mint = modint<998244353>;
int n, m, fa[20010], sil[20010], sir[20010], tag;
int leader(int x) { return x == fa[x] ? x : fa[x] = leader(fa[x]); }
mint f[5010], h[5010];
void merge(int x, int y) {
  x = leader(x), y = leader(y);
  if (x == y) return ;
  sil[x] += sil[y], sir[x] += sir[y], fa[y] = x;
}
void add(int x, int y, mint f[], int &tag) {
  int d = abs(x - y);
  tag += min(x, y);
  if (d) for (int i = n / 2; i >= d; i--) f[i] += f[i - d];
}
void del(int x, int y, mint f[], int &tag) {
  int d = abs(x - y);
  if (d) for (int i = d; i <= n / 2; i++) f[i] -= f[i - d];
  tag -= min(x, y);
}
void perf(int u, int v) {
  debug("u = %d, v = %d\n", u, v);
  if (leader(u) == leader(v)) return debug("leader(u) == leader(v)\n"), void(0);
  if (leader(u) == leader(v + n)) return debug("leader(u) == leader(v + n)\n"), void(0);
  int x = leader(u), y = leader(v + n), tag0 = tag;
  memcpy(h, f, sizeof(mint) * (n / 2 + 1));
  del(sil[x], sir[x], h, tag0), del(sil[y], sir[y], h, tag0), add(sil[x] + sil[y], sir[x] + sir[y], h, tag0);
  if (h[n / 2 - tag0]) merge(u, v + n), merge(v, u + n), debug("merged\n"), memcpy(f, h, sizeof(mint) * (n / 2 + 1)), tag = tag0;
  else debug("knapsack failed\n"), merge(u, v), merge(u + n, v + n);
}
int main() {
#ifndef LOCAL
  cin.tie(nullptr)->sync_with_stdio(false);
#endif
  cin >> n >> m, n <<= 1;
  for (int i = 1; i <= n * 2; i++) fa[i] = i;
  for (int i = 1; i <= n; i++) sil[i] = 1, sir[i + n] = 1;
  f[0] = 1;
  for (int i = 1; i <= n; i++) add(1, 0, f, tag);
  vector<pair<int, int>> edg(m);
  for (int i = 0; i < m; i++) cin >> edg[i].first >> edg[i].second;
  reverse(edg.begin(), edg.end());
  for (auto&& e : edg) perf(e.first, e.second); 
  for (int i = 1; i <= n; i++) {
    for (int j = i + 1; j <= n; j++) perf(i, j);
  }
  for (int i = 1; i <= n; i++) cout << (leader(1) == leader(i));
  cout << endl;
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3612kb

input:

2 4
1 3
2 4
1 4
1 2

output:

1010

result:

ok Output is valid. OK

Test #2:

score: 0
Accepted
time: 0ms
memory: 3608kb

input:

3 7
2 5
1 3
4 6
2 6
4 5
2 4
5 6

output:

100101

result:

ok Output is valid. OK

Test #3:

score: 0
Accepted
time: 0ms
memory: 3608kb

input:

1 0

output:

10

result:

ok Output is valid. OK

Test #4:

score: 0
Accepted
time: 0ms
memory: 3812kb

input:

1 1
1 2

output:

10

result:

ok Output is valid. OK

Test #5:

score: 0
Accepted
time: 0ms
memory: 3544kb

input:

2 3
2 4
3 4
1 2

output:

1001

result:

ok Output is valid. OK

Test #6:

score: 0
Accepted
time: 0ms
memory: 3680kb

input:

3 8
4 6
3 5
1 4
2 4
1 6
1 2
3 4
4 5

output:

101010

result:

ok Output is valid. OK

Test #7:

score: -100
Wrong Answer
time: 0ms
memory: 3624kb

input:

4 9
4 7
3 8
1 5
2 7
2 8
6 8
7 8
1 4
1 6

output:

10001001

result:

wrong answer The number of 0s must be equal to that of 1s.