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 sett;
for (int i = 1; i <= n; ++i) {
sett.insert(i);
}

vector 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  阅读(19)  评论(0)    收藏  举报