QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#662731 | #9449. New School Term | caijianhong | WA | 0ms | 3812kb | C++20 | 3.3kb | 2024-10-21 09:38:04 | 2024-10-21 09:38:05 |
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[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.