离散化后用普通线段树,#18 TLE 求助
查看原帖
离散化后用普通线段树,#18 TLE 求助
237530
rzh123楼主2022/7/29 09:52

RT.

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast") 
#include <bits/stdc++.h>
#define gc getchar()
#define pc(c) putchar(c)
using namespace std;
constexpr int N=2000007,NN=8000057;
int n,q;
struct Node{
	int l,r,ll,rr,s,lz;
}tr[NN];
struct Query{
	int l,r,k;
}qq[N];
int d[N],a[N],dc,ac;
inline int read(){
	register int t=0,f=1;
	register char c=gc;
	while(c!='-'&&(c<'0'||c>'9')) c=gc;
	if(c=='-') c=gc,f=-1;
	while(c>='0'&&c<='9') t=10*t+(c^48),c=gc;
	return f*t;
}
inline void write(int x){
	if(!x) return (void)pc('0');
	if(x<0) pc('-'),x=-x;
	static char c[23]={""};
	static int cc=0;
	while(x) c[++cc]=x%10,x/=10;
	while(cc) pc(c[cc--]|48);
}
inline void discrete(){
	sort(d+1,d+dc+1);
	for(int i=1;i<=dc;++i){
		if(i==1||d[i]!=d[i-1]){
			if(d[i]-a[ac]==2){
				++ac;
				a[ac]=a[ac-1]+1;
			}
			else if(d[i]-a[ac]>2){
				++ac;
				a[ac]=a[ac-1]+1;
				++ac;
				a[ac]=d[i]-1;
			}
			a[++ac]=d[i];
		}
	}
}
inline int query(int x){
	return lower_bound(a+1,a+ac+1,x)-a;
}
inline void assign(int k,int v){
	tr[k].s=v*(tr[k].rr-tr[k].ll+1);
	tr[k].lz=v;
}
inline void pushdown(int k){
	if(~tr[k].lz){
		assign(k<<1,tr[k].lz);
		assign(k<<1|1,tr[k].lz);
		tr[k].lz=-1;
	}
}
void pushup(int k){
	tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
	tr[k].ll=tr[k<<1].ll,
	tr[k].rr=tr[k<<1|1].rr;
}
void build(int k,int l,int r){
	tr[k].l=l,tr[k].r=r;
	tr[k].lz=-1;
	if(l==r){
		tr[k].ll=a[l-1]+1;
		tr[k].rr=a[l];
		tr[k].s=a[l]-a[l-1];
		return;
	}
	int m=(l+r)>>1;
	build(k<<1,l,m);
	build(k<<1|1,m+1,r);
	pushup(k);
}
void modify(int k,int l,int r,int v){ 
	if(tr[k].l>r||tr[k].r<l){
		return;
	}
	if(tr[k].l>=l&&tr[k].r<=r){
		return assign(k,v);
	}
	pushdown(k);
	modify(k<<1,l,r,v);
	modify(k<<1|1,l,r,v);
	pushup(k);
}
signed main(){
	n=read(),q=read();
	d[++dc]=1;
	for(int i=1;i<=q;++i){
		qq[i].l=read(),
		qq[i].r=read(),
		qq[i].k=read()-1;
		d[++dc]=qq[i].l;
		d[++dc]=qq[i].r;
	}
	d[++dc]=n;
	discrete();
	build(1,1,ac);
	for(int i=1;i<=q;++i){
		modify(1,query(qq[i].l),query(qq[i].r),qq[i].k);
		pushdown(1);
		write(tr[1].s),puts("");
	}
	return 0;
}

2022/7/29 09:52
加载中...