QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#87807 | #5369. 时间旅行 | Scintilla | 3 | 34ms | 4112kb | C++14 | 3.5kb | 2023-03-14 12:25:53 | 2023-03-14 12:25:54 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, s, e) for (int i = s; i <= e; ++i)
#define drep(i, s, e) for (int i = s; i >= e; --i)
#define file(a) freopen(#a".in", "r", stdin), freopen(#a".out", "w", stdout)
#define pv(a) cout << #a << " = " << a << endl
#define pa(a, l, r) cout << #a " : "; rep(_, l, r) cout << a[_] << ' '; cout << endl
const int N = 6e2 + 10;
int read() {
int x = 0, f = 1; char c = getchar();
for (; c < '0' || c > '9'; c = getchar()) if (c == '-') f = -1;
for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - 48;
return x * f;
}
int n, k;
vector <int> a[N];
int pre[N], tag[N], p[N], dfn[N], dn, ans;
bool ban[N];
vector <int> e[N];
queue <int> q;
int fa[N];
int get(int u) { return u == fa[u] ? u : fa[u] = get(fa[u]); }
int LCA(int u, int v) {
for (++ dn; ; u = pre[p[u]], swap(u, v)) {
if (dfn[u = get(u)] == dn) return u;
else if (u) dfn[u] = dn;
}
}
void shrink(int u, int v, int w) {
for (; get(u) != w; u = pre[v]) {
pre[u] = v, v = p[u], fa[u] = fa[v] = w;
if (tag[v] == 2) q.push(v), tag[v] = 1;
}
}
void rev(int u) {
if (p[pre[u]]) rev(p[pre[u]]);
p[pre[u]] = u, p[u] = pre[u];
}
bool blossom(int s) {
// cout << "----- blossom s = " << s << endl;
rep(i, 1, n + 2) pre[i] = tag[i] = 0, fa[i] = i;
q = queue <int> (), tag[s] = 1, q.push(s);
while (q.size()) {
int u = q.front(); q.pop();
for (int v : e[u]) if (!ban[v]) {
if (tag[v] == 1) {
int w = LCA(u, v);
shrink(u, v, w), shrink(v, u, w);
}
else if (!tag[v]) {
pre[v] = u, tag[v] = 2;
if (!p[v]) {
rev(v), ++ ans;
return true;
}
tag[p[v]] = 1, q.push(p[v]);
}
}
}
return false;
}
bool check(int d) {
// cout << "----- check d = " << d << endl;
ans = 0;
rep(i, 1, n + 2) e[i].clear(), p[i] = 0;
auto adde = [&](int u, int v) {
e[u].emplace_back(v);
e[v].emplace_back(u);
} ;
rep(i, 1, n) rep(j, i + 1, n) {
if (a[i][0] + d <= a[j].back()) adde(i, j);
else if (a[j][0] + d <= a[i].back()) adde(i, j);
}
rep(i, 1, n) if (!p[i]) blossom(i);
// pv(ans);
rep(i, 1, n) {
auto del = [&](int u) {
if (p[u]) p[p[u]] = 0, p[u] = 0, -- ans;
} ;
ban[i] = true, del(i);
for (auto x : a[i]) {
rep(j, 1, n) {
if (a[j][0] + d <= x) adde(j, n + 1);
if (x + d <= a[j].back()) adde(j, n + 2);
}
// cout << "i, x = " << i << ' ' << x << endl;
// pa(p, 1, n);
// if (blossom(n + 1) && blossom(n + 2)) {
// cout << "!!! ans = " << ans << endl;
// if (ans > (n - k) / 2) return true;
// }
blossom(n + 1), blossom(n + 2);
if (ans > (n - k) / 2) return true;
del(n + 1), del(n + 2);
e[n + 1].clear(), e[n + 2].clear();
rep(j, 1, n) {
if (x + d <= a[j].back()) e[j].pop_back();
if (a[j][0] + d <= x) e[j].pop_back();
}
}
ban[i] = false, blossom(i);
}
return false;
}
signed main() {
n = read(), k = read();
if (n - k & 1) return printf("Impossible\n"), 0;
for (int i = 1, t; i <= n; ++ i) {
a[i].resize(t = read());
rep(j, 0, t - 1) a[i][j] = read();
sort(a[i].begin(), a[i].end());
}
int l = 0, r = 1e18;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid + 1)) l = mid + 1;
else r = mid;
}
printf("%lld\n", l);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 3
Accepted
Test #1:
score: 3
Accepted
time: 3ms
memory: 3636kb
input:
13 1 1 13 1 2 1 9 1 11 1 8 1 5 1 6 1 4 1 10 1 7 1 12 1 1 1 3
output:
6
result:
ok single line: '6'
Test #2:
score: 0
Accepted
time: 3ms
memory: 3696kb
input:
101 1 1 71 1 95 1 1 1 4 1 85 1 11 1 94 1 29 1 99 1 41 1 59 1 51 1 79 1 67 1 13 1 84 1 16 1 43 1 55 1 18 1 92 1 10 1 77 1 86 1 49 1 20 1 8 1 32 1 72 1 40 1 52 1 76 1 39 1 61 1 82 1 66 1 44 1 3 1 35 1 37 1 48 1 15 1 96 1 33 1 83 1 2 1 30 1 75 1 54 1 70 1 22 1 63 1 60 1 88 1 97 1 34 1 9 1 17 1 57 1 80 ...
output:
50
result:
ok single line: '50'
Test #3:
score: 0
Accepted
time: 34ms
memory: 4112kb
input:
291 1 1 1 1 243 1 31 1 188 1 77 1 101 1 20 1 177 1 58 1 12 1 201 1 152 1 89 1 205 1 203 1 214 1 225 1 94 1 147 1 100 1 235 1 103 1 196 1 216 1 192 1 143 1 6 1 259 1 215 1 51 1 234 1 2 1 102 1 17 1 157 1 82 1 52 1 211 1 176 1 264 1 149 1 74 1 105 1 202 1 172 1 226 1 165 1 271 1 78 1 285 1 262 1 88 1 ...
output:
145
result:
ok single line: '145'
Subtask #2:
score: 0
Wrong Answer
Test #4:
score: 0
Wrong Answer
time: 2ms
memory: 3636kb
input:
14 2 2 844974872 196961856 2 282529753 793092789 1 450615292 2 894675938 183278191 2 134804124 988858141 1 440476238 2 892091463 453193625 2 918614039 267044448 1 91126449 2 699070127 177282394 2 365458732 596469725 2 789994620 379428523 2 758349986 369167103 2 227448762 297426831
output:
478137801
result:
wrong answer 1st lines differ - expected: '392388416', found: '478137801'
Subtask #3:
score: 0
Memory Limit Exceeded
Dependency #1:
100%
Accepted
Test #9:
score: 0
Memory Limit Exceeded
input:
287 1 1 173840701363378004 1 743361258032855446 1 746614854489854642 1 56541606566914354 1 420238720727662982 1 851742472173310082 1 663095483358412253 1 909940213272622771 1 793226013158281220 1 545752184531876147 1 428168322861170312 1 445062401949703086 1 781910693870313013 1 656624250154096657 1...
output:
result:
Subtask #4:
score: 0
Skipped
Dependency #3:
0%
Subtask #5:
score: 0
Skipped
Dependency #2:
0%
Subtask #6:
score: 0
Skipped
Dependency #5:
0%
Subtask #7:
score: 0
Skipped
Dependency #1:
100%
Accepted
Dependency #2:
0%