很显然,按照右端点从小到大排序,对于每段区间尽量地贪心放在靠右的位置即可。
中间用 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;
}