QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#57898 | #1878. No Rest for the Wicked | zghtyarecrenj | WA | 3ms | 51040kb | C++17 | 2.3kb | 2022-10-23 18:55:33 | 2022-10-23 18:55:35 |
Judging History
answer
#include <bits/stdc++.h>
const int N = 2e5 + 5;
int n, m, sz, c[N], t[N], s[N], fa[N], ans[N], rk[N], mx[N];
int *s1[N << 2], s2[N << 2], top;
std::vector<int> a[N * 2], b;
std::vector<std::tuple<int, int, int>> G[N << 3];
void modify(int k, int l, int r, int x, int y, const std::tuple<int, int, int> &t) {
if (y < r || x > l || x > y) return;
if (x <= l && r <= y) return (void)(G[k].push_back(t));
int mid = (l + r) >> 1;
if (x <= mid) modify(k * 2, l, mid, x, y, t);
if (y > mid) modify(k * 2 + 1, mid + 1, r, x, y, t);
}
inline int find(int x) {
while (x != fa[x]) x = fa[x] = fa[fa[x]];
return x;
}
inline void back(int x) {
while (top > x) *s1[top] = s2[top], --top;
}
inline void merge(int x, int y) {
x = find(x), y = find(y);
if (x == y) return;
if (rk[x] < rk[y]) std::swap(x, y);
s1[++top] = fa + y, s2[top] = fa[y];
fa[y] = x;
if (rk[x] == rk[y]) s1[++top] = rk + x, s2[top] = rk[x]++;
if (mx[y] > mx[x]) s1[++top] = mx + x, mx[x] = mx[y];
}
void solve(int k, int l, int r) {
int cur_tp = top;
for (auto &[u, v, t] : G[k]) {
if (!t) {
int f = find(u);
if (mx[f] < ans[v])
s1[++top] = mx + f, s2[top] = mx[f], mx[f] = ans[v];
} else merge(u, v);
}
if (l == r) for (int u : a[l]) ans[u] = mx[find(u)];
else {
int mid = (l + r) >> 1;
solve(k * 2 + 1, mid + 1, r);
solve(k * 2, l, mid);
}
back(cur_tp);
}
int main() {
scanf("%d%d", &n, &m);
std::iota(fa + 1, fa + 1 + n, 1);
for (int i = 1; i <= n; ++i) {
scanf("%d%d%d", c + i, t + i, s + i);
mx[i] = s[i];
b.push_back(c[i]), b.push_back(t[i]);
}
std::sort(b.begin(), b.end());
b.erase(std::unique(b.begin(), b.end()), b.end());
sz = b.size();
for (int i = 1; i <= n; ++i) {
c[i] = std::lower_bound(b.begin(), b.end(), c[i]) - b.begin() + 1;
t[i] = std::lower_bound(b.begin(), b.end(), t[i]) - b.begin() + 1;
a[c[i]].push_back(i);
}
for (int i = 1; i <= m; ++i) {
int x, y; scanf("%d%d", &x, &y);
if (c[x] > c[y]) std::swap(x, y);
int mn = std::min(t[x], t[y]);
if (mn >= c[y]) modify(1, 1, sz, c[y], mn, std::make_tuple(x, y, 1));
modify(1, 1, sz, c[x], std::min(mn, c[y] - 1), std::make_tuple(x, y, 0));
}
solve(1, 1, sz);
for (int i = 1; i <= n; ++i) printf("%d ", ans[i]);
puts("");
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 51040kb
input:
4 3 2 3 1 1 1 4 1 2 2 1 1 3 1 2 1 3 1 4
output:
1 4 2 3
result:
wrong answer 1st numbers differ - expected: '2', found: '1'