[ABC216G] 01Sequence

发布时间 2023-12-31 21:32:48作者: 徐子洋

题目链接

很显然,按照右端点从小到大排序,对于每段区间尽量地贪心放在靠右的位置即可。

中间用 std::set 维护当前还是 \(0\) 的位置,以及树状数组维护区间 \(1\) 的个数。

点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); ++i)
#define FR(i, a, b) for(int i = (a); i >= (b); --i)
constexpr int N = 2e5 + 10;
struct D{int l, r, x;} d[N];
int n, m, a[N];
std::set<int> s;
struct BIT{
	int n; int c[N];
	BIT(int x = 0) : n(x){}
	void resize(int x){FL(i, n + 1, x) c[i] = 0; n = x;}
	void clear(){FL(i, 1, n) c[i] = 0;}
	void add(int x, int v = 1){
		for(; x <= n; x += x & -x) c[x] += v;
	}
	int ask(int x, int ret = 0){
		for(; x; x -= x & -x) ret += c[x];
		return ret;
	}
} b;
int main(){
    scanf("%d%d", &n, &m), b.resize(n);
    FL(i, 1, n) s.emplace(i);
    FL(i, 1, m) scanf("%d%d%d", &d[i].l, &d[i].r, &d[i].x);
    std::sort(d + 1, d + m + 1, [&](D x, D y){return x.r < y.r;});
    FL(i, 1, m){
        auto it = s.upper_bound(d[i].r);
        while(it != s.begin() && b.ask(d[i].r) - b.ask(d[i].l - 1) < d[i].x){
            a[*--it] = 1, b.add(*it);
            s.erase(it), it = s.upper_bound(d[i].r);
        }
    }
    FL(i, 1, n) printf("%d%c", a[i], " \n"[i == n]);
    return 0;
}