QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#662699 | #9449. New School Term | caijianhong | WA | 0ms | 3816kb | C++20 | 3.1kb | 2024-10-21 09:19:45 | 2024-10-21 09:19:50 |
Judging History
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[10010], sil[10010], sir[10010], tag;
int leader(int x) { return x == fa[x] ? x : fa[x] = leader(fa[x]); }
mint f[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) {
int d = abs(x - y);
tag += min(x, y);
if (d) for (int i = n / 2 - tag; i >= d; i--) f[i] += f[i - d];
}
void del(int x, int y) {
int d = abs(x - y);
if (d) for (int i = d; i <= n / 2 - tag; i++) f[i] -= f[i - d];
tag -= min(x, y);
}
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);
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 (int i = 1; i <= n; i++) edg.emplace_back(1, i);
for (auto&& e : edg) {
int u = e.first, v = e.second;
debug("u = %d, v = %d\n", u, v);
if (leader(u) == leader(v)) continue;
if (leader(u) == leader(v + n)) continue;
int x = leader(u), y = leader(v + n);
del(sil[x], sir[x]), del(sil[y], sir[y]), add(sil[x] + sil[x], sir[x] + sir[y]);
if (f[n / 2 - tag]) merge(u, v + n), merge(v, u + n), debug("mgd\n");
else del(sil[x] + sil[x], sir[x] + sir[y]), add(sil[x], sir[x]), add(sil[y], sir[y]);
}
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: 0
Wrong Answer
time: 0ms
memory: 3816kb
input:
2 4 1 3 2 4 1 4 1 2
output:
1000
result:
wrong answer The number of 0s must be equal to that of 1s.