为什么我代码开 O2 会 RE 啊?
  • 板块学术版
  • 楼主Ybll_
  • 当前回复7
  • 已保存回复8
  • 发布时间2025/1/21 15:56
  • 上次更新2025/1/21 17:48:11
查看原帖
为什么我代码开 O2 会 RE 啊?
1367000
Ybll_楼主2025/1/21 15:56

P1558 色板游戏

#include<bits/stdc++.h>
#define int long long
#define up(x) tree[x].sum=tree[x*2].sum|tree[x*2+1].sum
using namespace std;
struct node
{
	int l,r,sum,lazy;
}tree[1000005];
int n,m,a[1000005];
int get_sum(int x)
{
	int sum=1;
	while(x--)
	{
		sum*=2;
	}
	return sum;
}
void down(int id)
{
	if(tree[id].lazy==0)return;
	tree[id*2].lazy=tree[id*2].sum=tree[id*2+1].lazy=tree[id*2+1].sum=tree[id].lazy;
	tree[id].lazy=0;
}
void build(int id,int l,int r)
{
	tree[id].l=l;
	tree[id].r=r;
	if(l==r)
	{
		tree[id].sum=1;
		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 v)
{
	if(tree[id].l>r||tree[id].r<l)return;
	if(tree[id].l>=l&&tree[id].r<=r)
	{
		tree[id].lazy=tree[id].sum=get_sum(v-1);
		return;
	}
	down(id);
	update(id*2,l,r,v);
	update(id*2+1,l,r,v);
	up(id);
}
int query(int id,int l,int r)
{
	if(tree[id].l>r||tree[id].r<l)return 0;
	if(tree[id].l>=l&&tree[id].r<=r)return tree[id].sum;
	down(id);
	return query(id*2,l,r)|query(id*2+1,l,r);
}
int get_ans(int x)
{
	int ans=0;
	while(x)
	{
		if(x%2==1)ans++;
		x/=2;
	}
	cout<<ans<<"\n";
}
signed main()
{
	cin>>n>>m>>m;
	build(1,1,n);
	while(m--)
	{
		char o;
		int l,r,k;
		cin>>o>>l>>r;
		if(l>r)swap(l,r);
		if(o=='C')
		{
			cin>>k;
			update(1,l,r,k);
		}
		else get_ans(query(1,l,r));
	}
	return 0;
}
2025/1/21 15:56
加载中...