社区讨论

O分求调qtqt

P1558色板游戏参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@m5zbv4qc
此快照首次捕获于
2025/01/16 20:49
去年
此快照最后确认于
2025/11/04 11:29
4 个月前
查看原帖
球dalao
awawa
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define maxn 300000+10
#define I ios::sync_with_stdio(0);
#define AK cin.tie(0);
#define CSP cout.tie(0);
using namespace std;
struct Node
{
	int L,R;
	int sum,lazy,ma;
}t[maxn*4];
int n,a[maxn];
void up(int id)//上去找爸爸更新 
{
	t[id].sum=t[id*2+1].sum | t[id*2].sum;
}
void down(int id)//处理编号id的为标记,下传给它的儿子
{
	t[id].lazy=t[id*2].lazy=t[id*2+1].lazy;
	t[id*2].sum=t[id*2+1].sum+t[id*2].sum;
	t[id].lazy=0;
}
void build(int id,int l,int r)//新建一个节点,编号为id,左端点为l,右端点为r
{
	t[id].L=l;
	t[id].R=r;
	if(l==r)//节点表示的区间为一个点,递归边界
	{
		t[id].sum=(1<<a[l]);
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	up(id);
}
void update(int id,int l,int r,int val)//将l,r区间同时加上一个val
{
	if(t[id].L>r||t[id].R<l)
	{
		return;
	}
	if(t[id].L>=l && t[id].R<=r)//节点自己处理
	{
		t[id].lazy=t[id].sum=1<<(val-1);
		return;
	}
	if(t[id].lazy!=0)
	{
		down(id);
	}
	update(id*2,l,r,val);
	update(id*2+1,l,r,val);
	up(id);
}
int ask_sum(int id,int l,int r)
{
	if(t[id].L>r||t[id].R<l)
	{
		return 0;
	}
	if(t[id].L>=l&&t[id].R<=r)
	{
		return t[id].sum;
	}
	if(t[id].lazy!=0)
	{
		down(id);
	}
	return t[id*2+1].sum | t[id*2].sum;
}
signed main()
{
	I AK CSP
	int m,l,r,val;
	char opt;
	cin>>n>>m>>m;
	build(1,1,n);//进士候任 
	while(m--)
	{
		cin>>opt;
		cin>>l>>r;
		if(l>r)	swap(l,r);
		if(opt=='C')//修改操作
		{
			cin>>val;
			update(1,l,r,val);
		}
		else//查询
		{
			int cntt=ask_sum(1,l,r);
			int ans=0;
			for(int i=cntt;i>0;i/=2)
			{
				ans+=i%2;
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...