A. Knight Tournament

https://codeforces.com/problemset/problem/356/A

题意:给定n个数m个区间,每次该区间内会剩下一个数,其他的数都被这个数打败。最后只会剩下一个数,输出每个数是被哪个数打败的。

思路:直接红黑树维护1~n,每次在区间内二分找到区间左右端点,然后遍历区间内还残留的值,将答案赋予给本次区间指定的赢家即可,时间复杂度O(m) * O(logn)?

总结:暴力破解的思路是每个区间给出来,都遍历区间,然后看哪个数还存在,再指定,直接使用红黑树把不存在的数字删掉,就可以避免这个重复的查询了。难点是读题目难懂。

inline void solve() {
	int n, m;
	cin >> n >> m;

	set<int> sett;
	for (int i = 1; i <= n; ++i) {
		sett.insert(i);
	}

	vector<int> ans(n + 1);
	for (int i = 0; i < m; ++i) {
		int l, r, x;
		cin >> l >> r >> x;

		auto it = sett.lower_bound(l);
		auto rt = sett.upper_bound(r);
		while (it != rt) {
			if ((*it) != x) {
				ans[*it] = x;
				auto t = next(it);
				sett.erase(it);
				it = t;
			}
			else {
				it ++;
			}

		}
	}

	for (int i = 1; i <= n; ++i) {
		cout << ans[i] << " \n"[i == n];
	}
}
posted @ 2025-09-18 09:34  _Yxc  阅读(6)  评论(0)    收藏  举报