30个线段树笨方法,90分求助
查看原帖
30个线段树笨方法,90分求助
1050958
liupinli2012_mini楼主2024/3/29 22:08

提交结果

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,k,q;
struct node
{
	int tree[N*2],tag[N*2];
	void pushup(int cur)
	{
		if(tree[cur*2]==1||tree[cur*2+1]==1)
			tree[cur]=1;
		else
			tree[cur]=0;
	}
	void addtag(int cur,int l,int r,int k)
	{
		tag[cur]=k;
		tree[cur]=k;
	}
	void pushdown(int cur,int l,int r)
	{
		if(tag[cur]==-1)
			return ;
		int mid=l+r>>1;
		addtag(cur*2,l,mid,tag[cur]);
		addtag(cur*2+1,mid+1,r,tag[cur]);
		tag[cur]=-1;
	}
	int find(int cur,int l,int r,int ql,int qr)
	{
		if(l>qr||r<ql)
			return 0;
		if(ql<=l&&r<=qr)
			return tree[cur];
		pushdown(cur,l,r);
		int mid=l+r>>1;
		return find(cur*2,l,mid,ql,qr)|find(cur*2+1,mid+1,r,ql,qr);
	}
	void update(int cur,int l,int r,int ql,int qr,int k)
	{
		if(l>qr||r<ql)
			return ;
		if(ql<=l&&r<=qr)
		{
			addtag(cur,l,r,k);
			return ;
		}
		pushdown(cur,l,r);
		int mid=l+r>>1;
		update(cur*2,l,mid,ql,qr,k);
		update(cur*2+1,mid+1,r,ql,qr,k);
		pushup(cur);
	}
}a[35];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k>>q;
	a[1].update(1,1,n,1,n,1);
	for(int i=1;i<=q;i++)
	{
		char op;
		int l,r,k;
		cin>>op>>l>>r;
		if(l>r)
			swap(l,r);
		if(op=='C')
		{
			int k;
			cin>>k;
			for(int j=1;j<=30;j++)
				a[j].update(1,1,n,l,r,0);
			a[k].update(1,1,n,l,r,1);
		}
		else if(op=='P')
		{
			int ans=0;
			for(int j=1;j<=30;j++)
				ans+=a[j].find(1,1,n,l,r);
			cout<<ans<<"\n";
		}
	}
	return 0;
}

代码

2024/3/29 22:08
加载中...