社区讨论
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 条回复,欢迎继续交流。
正在加载回复...