QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#57899#1878. No Rest for the WickedzghtyarecrenjWA 7ms51584kbC++172.3kb2022-10-23 18:56:062022-10-23 18:56:09

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-23 18:56:09]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:51584kb
  • [2022-10-23 18:56:06]
  • 提交

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) 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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 7ms
memory: 51584kb

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'