- -比赛时用了很奇怪的方法 然后最后评判TLE了。。。。 赛后中规中矩的用线段树过了
#include <algorithm> #include <cstring> #include <cstdio> #include <queue> using namespace std; int kn[300005], len[300005]; struct segTree { int l, r, va; } seg[300005<<2]; void build(int l,int r,int rt) { seg[rt].l=l, seg[rt].r=r, seg[rt].va=0; if(l==r) return; int m=(l+r)>>1; build(l,m,rt<<1); build(m+1,r,rt<<1|1); }; void change(int l,int r,int rt,int va) { int tl=seg[rt].l, tr=seg[rt].r; if(seg[rt].va) return; if(tl==tr) { seg[rt].va=va; return; } int m=(tl+tr)>>1; if(l<=m) change(l,r,rt<<1,va); if(r>m) change(l,r,rt<<1|1,va); if(seg[rt<<1].va&&seg[rt<<1|1].va) seg[rt].va=1; } void cg(int x,int rt) { int tl=seg[rt].l, tr=seg[rt].r; if(tl==tr) { seg[rt].va=0; return; } int m=(tl+tr)>>1; if(x<=m) cg(x,rt<<1); if(x>m) cg(x,rt<<1|1); seg[rt].va=0; } void update(int l,int r,int rt) { int tl=seg[rt].l, tr=seg[rt].r; if(tl==tr) { printf("%d ",seg[rt].va); return; } update(l,r,rt<<1); update(l,r,rt<<1|1); } int main() { int n, m, i, j, l, r, x; scanf("%d%d",&n,&m); build(1,n,1); for(i=0; i<m; i++) { scanf("%d%d%d",&l,&r,&x); change(l,r,1,x); cg(x,1); } update(1,n,1); puts(""); return 0; }