G - 01Sequence
思路:
可以看出,我们应该贪心的将 1 1 1的数量放在最后面开始放,我们可以用树状数组在实现区间查询修改,用并查集来支持从最右边开始单点修改的位置。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+7;
struct node{int l,r,x;}a[N];
int n,m,Ans[N],tr[N],f[N];
int lowbit(int i){return i&(-i);}
int fin(int x){return f[x]==x? x:f[x]=fin(f[x]);}
void add(int x){
for(int i=x;i<=n;i+=lowbit(i)) tr[i]++;
}
int ask(int x){
int sum=0;
for(int i=x;i;i-=lowbit(i)) sum=sum+tr[i];
return sum;
}
bool cmp(node x,node y){
return x.r<y.r;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].l>>a[i].r>>a[i].x;
}
for(int i=0;i<=n;i++) f[i]=i;
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++){
int lim=a[i].x-(ask(a[i].r)-ask(a[i].l-1));
for(int j=1;j<=lim;j++){
int u=fin(a[i].r);
add(u),Ans[u]=1;
f[u]=fin(u-1);
}
}
for(int i=1;i<=n;i++) cout<<Ans[i]<<" ";
cout<<"\n";
}