QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#788580 | #9449. New School Term | Misuki# | WA | 2203ms | 11096kb | C++20 | 9.3kb | 2024-11-27 17:31:48 | 2024-11-27 17:31:49 |
Judging History
answer
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfenv>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdarg>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <initializer_list>
#include <iomanip>
#include <ios>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <streambuf>
#include <string>
#include <tuple>
#include <type_traits>
#include <variant>
#include <bit>
#include <compare>
#include <concepts>
#include <numbers>
#include <ranges>
#include <span>
//#define int ll
#define INT128_MAX (__int128)(((unsigned __int128) 1 << ((sizeof(__int128) * __CHAR_BIT__) - 1)) - 1)
#define INT128_MIN (-INT128_MAX - 1)
#define clock chrono::steady_clock::now().time_since_epoch().count()
using namespace std;
template<class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2> pr) {
return os << pr.first << ' ' << pr.second;
}
template<class T, size_t N>
ostream& operator<<(ostream& os, const array<T, N> &arr) {
for(size_t i = 0; T x : arr) {
os << x;
if (++i != N) os << ' ';
}
return os;
}
template<class T>
ostream& operator<<(ostream& os, const vector<T> &vec) {
for(size_t i = 0; T x : vec) {
os << x;
if (++i != size(vec)) os << ' ';
}
return os;
}
template<class T>
ostream& operator<<(ostream& os, const set<T> &s) {
for(size_t i = 0; T x : s) {
os << x;
if (++i != size(s)) os << ' ';
}
return os;
}
template<class T1, class T2>
ostream& operator<<(ostream& os, const map<T1, T2> &m) {
for(size_t i = 0; pair<T1, T2> x : m) {
os << x;
if (++i != size(m)) os << ' ';
}
return os;
}
#ifdef DEBUG
#define dbg(...) cerr << '(', _do(#__VA_ARGS__), cerr << ") = ", _do2(__VA_ARGS__)
template<typename T> void _do(T &&x) { cerr << x; }
template<typename T, typename ...S> void _do(T &&x, S&&...y) { cerr << x << ", "; _do(y...); }
template<typename T> void _do2(T &&x) { cerr << x << endl; }
template<typename T, typename ...S> void _do2(T &&x, S&&...y) { cerr << x << ", "; _do2(y...); }
#else
#define dbg(...)
#endif
using ll = long long;
using ull = unsigned long long;
using ldb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
//#define double ldb
template<typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
template<typename T> using max_heap = priority_queue<T>;
template<ranges::forward_range rng, class T = ranges::range_value_t<rng>, class OP = plus<T>>
void pSum(rng &&v) {
if (!v.empty())
for(T p = v[0]; T &x : v | views::drop(1))
x = p = OP()(p, x);
}
template<ranges::forward_range rng, class T = ranges::range_value_t<rng>, class OP>
void pSum(rng &&v, OP op) {
if (!v.empty())
for(T p = v[0]; T &x : v | views::drop(1))
x = p = op(p, x);
}
template<ranges::forward_range rng>
void Unique(rng &v) {
ranges::sort(v);
v.resize(unique(v.begin(), v.end()) - v.begin());
}
template<ranges::random_access_range rng>
rng invPerm(rng p) {
rng ret = p;
for(int i = 0; i < ssize(p); i++)
ret[p[i]] = i;
return ret;
}
template<ranges::random_access_range rng, ranges::random_access_range rng2>
rng Permute(rng v, rng2 p) {
rng ret = v;
for(int i = 0; i < ssize(p); i++)
ret[p[i]] = v[i];
return ret;
}
template<bool directed>
vector<vector<int>> readGraph(int n, int m, int base) {
vector<vector<int>> g(n);
for(int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
u -= base, v -= base;
g[u].emplace_back(v);
if constexpr (!directed)
g[v].emplace_back(u);
}
return g;
}
template<class T>
void setBit(T &msk, int bit, bool x) {
msk = (msk & ~(T(1) << bit)) | (T(x) << bit);
}
template<class T> void flipBit(T &msk, int bit) { msk ^= T(1) << bit; }
template<class T> bool getBit(T msk, int bit) { return msk >> bit & T(1); }
template<class T>
T floorDiv(T a, T b) {
if (b < 0) a *= -1, b *= -1;
return a >= 0 ? a / b : (a - b + 1) / b;
}
template<class T>
T ceilDiv(T a, T b) {
if (b < 0) a *= -1, b *= -1;
return a >= 0 ? (a + b - 1) / b : a / b;
}
template<class T> bool chmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<class T> bool chmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef vector<int> vi;
//source: KACTL(https://github.com/kth-competitive-programming/kactl)
ull modmul(ull a, ull b, ull M) {
ll ret = a * b - M * ull(1.L / M * a * b);
return ret + M * (ret < 0) - M * (ret >= (ll)M);
}
ull modpow(ull b, ull e, ull mod) {
ull ans = 1;
for (; e; b = modmul(b, b, mod), e /= 2)
if (e & 1) ans = modmul(ans, b, mod);
return ans;
}
bool isPrime(ull n) {
if (n < 2 || n % 6 % 4 != 1) return (n | 1) == 3;
ull A[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022},
s = __builtin_ctzll(n-1), d = n >> s;
for (ull a : A) { // ^ count trailing zeroes
ull p = modpow(a%n, d, n), i = s;
while (p != 1 && p != n - 1 && a % n && i--)
p = modmul(p, p, n);
if (p != n-1 && i != s) return 0;
}
return 1;
}
struct DSU {
vector<int> dep;
vector<int> bos;
vector<int> d;
int size;
DSU(int _size) : size(_size), dep(_size, 0), bos(_size), d(_size) {
iota(bos.begin(), bos.end(), 0);
}
array<int, 2> query(int V) {
if (bos[V] == V) {
return {d[V], V};
} else {
auto res = query(bos[V]);
d[V] ^= res[0];
bos[V] = res[1];
return {d[V], bos[V]};
}
}
bool merge(int V1, int V2, bool eq) {
int del = (eq ? 0 : 1);
int B1 = query(V1)[1];
int B2 = query(V2)[1];
if (B1 == B2)
return (d[V1] ^ d[V2]) == del;
if (dep[B1] < dep[B2]) {
bos[B1] = B2, d[B1] = d[V1] ^ d[V2] ^ del;
} else if (dep[B1] > dep[B2]) {
bos[B2] = B1, d[B2] = d[V1] ^ d[V2] ^ del;
} else {
bos[B1] = B2, d[B1] = d[V1] ^ d[V2] ^ del;
dep[B2] += 1;
}
return true;
}
};
mt19937 rng(clock);
uniform_int_distribution<int> unif(500'000'000, 1'000'000'000);
const int K = 4;
array<int, 4> P;
struct knapsack {
static const int C = 5001;
int base = 0;
array<array<int, C>, K> dp;
knapsack() : dp({}) {
for(int i = 0; i < K; i++) dp[i][0] = 1;
}
void add_item(array<int, 2> x) {
base += ranges::min(x);
int w = abs(x[0] - x[1]);
if (w == 0) return;
for(int i = 0; i < K; i++)
for(int j = C - 1; j >= w; j--)
dp[i][j] = (dp[i][j] + dp[i][j - w]) % P[i];
}
void del_item(array<int, 2> x) {
base -= ranges::min(x);
int w = abs(x[0] - x[1]);
if (w == 0) return;
for(int i = 0; i < K; i++)
for(int j = w; j < C; j++)
dp[i][j] = (dp[i][j] - dp[i][j - w] + P[i]) % P[i];
}
bool query(int s) {
dbg(s, base);
for(int i = 0; i < K; i++)
if (dp[i][s - base] != 0)
return true;
return false;
}
};
signed main() {
ios::sync_with_stdio(false), cin.tie(NULL);
for(int i = 0; i < K; i++)
while(!isPrime(P[i] = unif(rng))) ;
int n, m; cin >> n >> m;
vector<array<int, 2>> e(m);
for(auto &[a, b] : e) {
cin >> a >> b;
a--, b--;
}
vector<array<int, 2>> f(2 * n, {1, 0});
DSU dsu(2 * n);
auto update_f = [&]() {
fill(f.begin(), f.end(), array<int, 2>{0, 0});
for(int i = 0; i < 2 * n; i++) {
auto [d, bos] = dsu.query(i);
f[bos][d]++;
}
};
knapsack ks;
for(int i = 0; i < 2 * n; i++)
ks.add_item(f[i]);
//string con;
for(auto [a, b] : e | views::reverse) {
auto [da, ba] = dsu.query(a);
auto [db, bb] = dsu.query(b);
if (ba == bb) { /*con += '0';*/ continue; }
ks.del_item(f[ba]), ks.del_item(f[bb]);
array<int, 2> x = f[ba];
if (da == db) x[0] += f[bb][1], x[1] += f[bb][0];
else x[0] += f[bb][0], x[1] += f[bb][1];
ks.add_item(x);
if (ks.query(n)) {
dsu.merge(a, b, false);
update_f();
//con += '1';
} else {
ks.del_item(x);
ks.add_item(f[ba]);
ks.add_item(f[bb]);
//con += '0';
}
//assert(ks.query(n));
}
//cout << con << '\n';
//return 0;
vector<int> pre(n + 1, -1);
pre[0] = 0;
int base = 0;
for(int j = -1; auto [x, y] : f) {
j++;
base += min(x, y);
int w = abs(x - y);
if (w == 0) continue;
for(int i = n; i >= w; i--)
if (pre[i - w] != -1)
pre[i] = j;
}
//assert(pre[n - base] != -1);
vector<bool> flip(2 * n, false);
for(int i = 0; i < 2 * n; i++) flip[i] = f[i][1] < f[i][0];
{
int i = n - base;
while(i != 0) {
flip[pre[i]] = !flip[pre[i]];
i -= abs(f[pre[i]][0] - f[pre[i]][1]);
}
}
string ans;
for(int i = 0; i < 2 * n; i++) {
auto [d, bos] = dsu.query(i);
ans += '0' + (d ^ flip[bos]);
}
cout << ans << '\n';
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3912kb
input:
2 4 1 3 2 4 1 4 1 2
output:
0101
result:
ok Output is valid. OK
Test #2:
score: 0
Accepted
time: 1ms
memory: 3716kb
input:
3 7 2 5 1 3 4 6 2 6 4 5 2 4 5 6
output:
110010
result:
ok Output is valid. OK
Test #3:
score: 0
Accepted
time: 0ms
memory: 3656kb
input:
1 0
output:
10
result:
ok Output is valid. OK
Test #4:
score: 0
Accepted
time: 1ms
memory: 3940kb
input:
1 1 1 2
output:
10
result:
ok Output is valid. OK
Test #5:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
2 3 2 4 3 4 1 2
output:
0110
result:
ok Output is valid. OK
Test #6:
score: 0
Accepted
time: 2ms
memory: 3716kb
input:
3 8 4 6 3 5 1 4 2 4 1 6 1 2 3 4 4 5
output:
010101
result:
ok Output is valid. OK
Test #7:
score: 0
Accepted
time: 3ms
memory: 3952kb
input:
4 9 4 7 3 8 1 5 2 7 2 8 6 8 7 8 1 4 1 6
output:
10101001
result:
ok Output is valid. OK
Test #8:
score: 0
Accepted
time: 3ms
memory: 3784kb
input:
5 16 3 6 9 10 2 7 1 10 1 5 2 10 3 5 5 6 3 4 2 5 4 5 3 8 4 7 6 8 1 6 7 10
output:
0010111010
result:
ok Output is valid. OK
Test #9:
score: 0
Accepted
time: 3ms
memory: 3948kb
input:
6 13 4 5 2 9 3 8 4 8 4 11 10 12 3 4 3 9 5 11 2 8 5 10 5 8 1 11
output:
001001110110
result:
ok Output is valid. OK
Test #10:
score: 0
Accepted
time: 6ms
memory: 3716kb
input:
12 153 1 24 16 18 7 14 1 16 20 21 9 14 21 22 4 5 17 24 4 12 5 17 13 24 14 15 12 23 12 16 8 11 14 24 9 16 2 5 6 19 11 17 4 22 4 7 6 16 7 20 8 15 5 24 2 10 10 21 21 24 1 12 11 19 18 21 18 24 12 17 13 22 7 9 13 23 4 9 11 13 15 21 5 7 2 4 15 16 17 19 11 16 11 20 7 8 4 15 13 14 6 18 2 19 9 13 23 24 4 21 ...
output:
111100011001101110000001
result:
ok Output is valid. OK
Test #11:
score: 0
Accepted
time: 124ms
memory: 3680kb
input:
259 33757 472 500 65 336 138 469 307 442 427 458 43 239 17 508 460 466 108 393 79 92 250 483 44 277 17 132 35 57 155 499 184 474 246 272 274 418 457 458 338 372 196 514 31 208 117 187 90 229 153 284 189 355 16 337 146 456 269 271 279 412 305 336 303 441 399 472 85 286 91 97 157 437 137 379 71 360 27...
output:
111000110010111001101110000111000000011111100010101100100010001110101101111110000111000101111100010110101110111100011010101100111010010011101010011010011010011101100111001011110001100111000010101011100110110001001010010010101010010110011001100001010110000100001110101110000010110001010010000110110011...
result:
ok Output is valid. OK
Test #12:
score: 0
Accepted
time: 399ms
memory: 5512kb
input:
811 265557 217 1153 383 1609 165 177 612 1602 1057 1428 37 436 135 1200 368 684 448 722 145 1583 325 1052 246 480 74 148 122 1111 1256 1327 304 1070 1285 1542 802 813 454 1563 265 1193 94 848 432 1156 429 1194 427 1230 1152 1406 1329 1355 702 845 591 1232 877 1288 1257 1549 340 659 1080 1333 910 137...
output:
110111111101000111011111111101011110100101000101001000000001111000101111010100100101110100110101000111110100111100100110111110100101110101111100011110101010011001101010100110010011011111011011110101111111011000001100001101110111111110100010011100011110111111010001011111110110011111100001010011011101...
result:
ok Output is valid. OK
Test #13:
score: 0
Accepted
time: 819ms
memory: 5832kb
input:
1691 323743 1246 2397 1445 2647 2010 2806 2001 2896 802 2258 2679 2976 2203 2875 2445 2698 137 3004 536 1800 2316 2520 594 1517 279 1558 1934 2871 57 1358 357 976 1764 2672 869 2137 1694 2201 491 1906 1177 1414 1304 1377 2454 2653 626 2637 1425 1677 620 876 1326 2085 404 874 626 1565 136 597 2885 31...
output:
000101110111111001001111011011101100010010100110100011010001111100011101110000111110111101011010000101000111000111001100011011001111001110110010001101001000001001001101011010101010111011011101000110100100000001101100111100001010111000100101101001010100100110110001011011001110011010000011000100010101...
result:
ok Output is valid. OK
Test #14:
score: 0
Accepted
time: 1406ms
memory: 5780kb
input:
2891 285302 2273 3206 2376 4737 1075 5673 2493 5453 548 1902 603 1376 1948 2985 108 4730 2172 2948 947 1758 762 1558 2813 5701 2287 3502 297 1501 568 4247 4569 5071 832 3005 412 4226 1813 4519 726 3017 1658 3990 1771 3230 1705 2149 765 4782 5420 5652 3089 4727 4362 5054 1578 3729 1111 5740 2234 5691...
output:
001110110111111001100111000010110001001000011010100001010110101011011111011011111000101110011000000001111010101010010001000111101110110100111011001111111000110010101000000110100011111110110001010000001010101000111000111111111010100111001010100001110100011110111111111010100110110001110011110111001110...
result:
ok Output is valid. OK
Test #15:
score: 0
Accepted
time: 2203ms
memory: 9024kb
input:
4413 717147 1990 3721 2169 8724 2894 5350 4689 5732 274 3456 3149 5664 463 6517 3482 7460 1820 5440 2995 6364 5476 7590 5989 8692 4286 7015 7520 8630 524 7821 3335 7017 1491 4477 6238 8230 6339 8087 565 8666 6188 6930 4280 7015 4393 8825 3686 6189 3711 6905 888 1997 2488 8544 9 3914 5135 5322 2778 6...
output:
101101100111010000110001100011010100101110101111100111111001010100010110110001010001100100001010011100001001011011100110011000000101000011111100011001101011101100001010111001111101110001011100001011101001101000011100110101011100101110110010100010111111110011011011010101001000000111100101110110001111...
result:
ok Output is valid. OK
Test #16:
score: 0
Accepted
time: 411ms
memory: 11096kb
input:
707 998991 16 83 733 1195 318 945 9 385 764 1338 396 833 408 1331 541 1405 167 1351 572 838 16 334 36 1071 765 873 445 930 48 168 857 1306 1066 1408 270 720 116 698 737 1136 460 1074 585 1195 492 690 1103 1122 698 1239 623 1355 30 140 952 1088 776 1138 71 525 690 1194 357 1062 366 632 46 744 312 520...
output:
110110010110010001001101110000000111110101010001100010101010010001101011001110011110101101100100001101010001001101000011010101001101001010110010101101001110111001000000010111010100000100011011011010101101110101111000100001101000000000001001111111000010110011110000100111010110110110000000010011101100...
result:
ok Output is valid. OK
Test #17:
score: -100
Wrong Answer
time: 370ms
memory: 3956kb
input:
5000 0
output:
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...
result:
wrong answer The number of 0s must be equal to that of 1s.