社区讨论

动态开点线段树RE on 18求助

CF915EPhysical Education Lessons参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lo95cktf
此快照首次捕获于
2023/10/28 05:50
2 年前
此快照最后确认于
2023/10/28 05:50
2 年前
查看原帖
是我的写法太菜了吗
CPP
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,q;
struct Segment_Tree
{
	int ls[8000005],rs[8000005];
	int l[8000005],r[8000005];
	int tot,w[8000005],lzy[8000005];
	int build(int ll,int rr)
	{
		tot++;
		l[tot]=ll;r[tot]=rr;
		w[tot]=0;lzy[tot]=-1;
		ls[tot]=rs[tot]=0;
		return tot;
	}
	void down(int k)
	{
		int mid=(l[k]+r[k])/2;
		if(ls[k]==0) ls[k]=build(l[k],mid);
		if(rs[k]==0) rs[k]=build(mid+1,r[k]);
		if(lzy[k]==-1) return ;
		w[ls[k]]=lzy[k]*(mid-l[k]+1);
		w[rs[k]]=lzy[k]*(r[k]-mid);
		lzy[ls[k]]=lzy[rs[k]]=lzy[k];
		lzy[k]=-1;
		return ;
	}
	void change(int ll,int rr,int val,int k)
	{
		if(ll<=l[k]&&r[k]<=rr)
		{
			w[k]=val*(r[k]-l[k]+1);
			lzy[k]=val;
			return ;
		}
		down(k);
		int mid=(l[k]+r[k])/2;
		if(ll<=mid) change(ll,rr,val,ls[k]);
		if(mid<rr) change(ll,rr,val,rs[k]);
		w[k]=w[ls[k]]+w[rs[k]];
		return ;
	}
	int query(){return w[1];}
}tr;
int main()
{
	scanf("%d%d",&n,&q);
	tr.build(1,n);
	for(int i=1;i<=q;i++)
	{
		int ll,rr,val;
		scanf("%d%d%d",&ll,&rr,&val);
		val%=2;
		tr.change(ll,rr,val,1);
		printf("%d\n",n-tr.query());
	}
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...