动态开点线段树求助卡常
查看原帖
动态开点线段树求助卡常
477757
V1mnkE楼主2023/1/14 16:59

rt,TLE on #18

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=15001000;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
	return x*f;
}
inline void write(int x){
	static char buf[20];
	static int len=-1;
	if(x<0)putchar('-'),x=-x;
	do buf[++len]=x%10,x/=10;while(x);
	while(len>=0)putchar(buf[len--]+'0');
	putchar('\n');
}
int lowbit(int x){return x&-x;}
int qpow(int a,int b){
	int ans=1;
	while(b){
		if(b&1){
			ans*=a;
			ans%=mod;
		}
		a*=a;
		a%=mod;
		b>>=1;

	}
	return ans;
}
int ls[maxn],rs[maxn],tag[maxn],sum[maxn];
int cnt=1;
int n,q;
// int add(){cnt++,tag[cnt]=-1;return cnt;}
inline void pushup(int o){sum[o]=sum[ls[o]]+sum[rs[o]];}
inline void pushdown(int o,int l,int r){
	if(tag[o]==-1)return ;
	int mid=r+l>>1;
	if(!ls[o])ls[o]=++cnt;
	if(!rs[o])rs[o]=++cnt;
	sum[ls[o]]=(mid-l+1)*tag[o];
	sum[rs[o]]=(r-mid)*tag[o];
	tag[ls[o]]=tag[rs[o]]=tag[o];
	tag[o]=-1;
}
void update(int &o,int l,int r,int x,int y,int val){
	if(!o)o=++cnt;
	if(l>=x&&r<=y){
		tag[o]=val;
		sum[o]=(r-l+1)*val;
		return ;
	}
	pushdown(o,l,r);
	int mid=l+r>>1;
	if(x<=mid)update(ls[o],l,mid,x,y,val);
	if(y>mid)update(rs[o],mid+1,r,x,y,val);
	pushup(o);
}
int main(){
	memset(tag,-1,sizeof tag);
	n=read(),q=read();
	int rt=1;
	while(q--){
		int l=read(),r=read(),k=read();
		update(rt,1,n,l,r,2-k);
		write(n-sum[1]);
	}
}
2023/1/14 16:59
加载中...