mxqz动态开点模板
查看原帖
mxqz动态开点模板
234783
conprour楼主2021/11/15 16:02

RT,TLE on #18,感觉和这篇题解没什么区别,求帮看看为什么会 T

代码很简单的

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FCC fclose(stdin),fclose(stdout)
#define mid ((l+r)>>1)
const int INF = 0x3f3f3f3f,N = 6e5+10;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
int n,q,rt;
struct Segtree
{
	int sum[N<<5],ls[N<<5],rs[N<<5];
	int tot,laz[N<<5];
	inline void add(int &k,int l,int r,int v)
	{
		if(!k) k=++tot;
		laz[k]=v;
		sum[k]=(r-l+1)*v;
	//	printf("sum[%d]: [%d,%d] = %d\n",k,l,r,sum[k]);
	}
	inline void pushdown(int k,int l,int r)
	{
		if(laz[k]==-1) return;
		add(ls[k],l,mid,laz[k]);
		add(rs[k],mid+1,r,laz[k]);
		laz[k]=-1;
	}
	void modify(int &k,int l,int r,int x,int y,int v)
	{
		if(!k) k=++tot;		
		if(x<=l&&r<=y) return add(k,l,r,v);
		pushdown(k,l,r);
		if(x<=mid) modify(ls[k],l,mid,x,y,v);
		if(y>mid)  modify(rs[k],mid+1,r,x,y,v);
		sum[k]=sum[ls[k]]+sum[rs[k]];
		
	}
}str;
void work()
{
	n=read(),q=read();
	memset(str.laz,-1,sizeof(str.laz));
	while(q--)
	{
		int l=read(),r=read(),op=read();
		if(op==1) str.modify(rt,1,n,l,r,1);
		else str.modify(rt,1,n,l,r,0);
		printf("%d\n",n-str.sum[rt]);
	}
	return;
}

int main()
{
	work();
	return 0;
}
2021/11/15 16:02
加载中...