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

浙公网安备 33010602011771号