萌新求助卡常
  • 板块学术版
  • 楼主Spasmodic
  • 当前回复10
  • 已保存回复10
  • 发布时间2020/10/30 22:54
  • 上次更新2023/11/5 09:27:40
查看原帖
萌新求助卡常
121027
Spasmodic楼主2020/10/30 22:54
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int N=100005;
int n,k,m;
bitset<31>sum[N<<2],tag1[N<<2],tag2[N<<2];
void pushup(int k){sum[k]=sum[k<<1]|sum[k<<1|1];}
void lazy(int k,int l,int r,int v,int id){
	tag1[k][id]=v,tag2[k][id]=1;
	sum[k][id]=v;
}
void pushdown(int k,int l,int r,int mid,int id){
	if(!tag2[k][id])return;
	lazy(k<<1,l,mid,tag1[k][id],id);
	lazy(k<<1|1,mid+1,r,tag1[k][id],id);
	tag2[k][id]=0;
}
void pushdown(int k,int l,int r,int mid){
	for(int i=1;i<=30;i++)pushdown(k,l,r,mid,i);
}
void modify(int k,int l,int r,int x,int y,int id){
	if(x<=l&&r<=y){
		for(int i=1;i<=30;i++)lazy(k,l,r,i==id,i);
		return;
	}
	int mid=l+r>>1;
	pushdown(k,l,r,mid);
	if(x<=mid)modify(k<<1,l,mid,x,y,id);
	if(mid<y)modify(k<<1|1,mid+1,r,x,y,id);
	pushup(k);
}
bitset<31> query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return sum[k];
	int mid=l+r>>1;
	bitset<31>ret(0);
	pushdown(k,l,r,mid);
	if(x<=mid)ret|=query(k<<1,l,mid,x,y);
	if(mid<y)ret|=query(k<<1|1,mid+1,r,x,y);
	return ret;
}
char op[2];
int main(){
	scanf("%d%d%d",&n,&k,&m);
	lazy(1,1,n,1,1);
	for(int a,b,c;m--;){
		scanf("%s%d%d",op,&a,&b);
		if(a>b)swap(a,b);
		if(op[0]=='C'){
			scanf("%d",&c);
			modify(1,1,n,a,b,c);
		}else{
			printf("%d\n",query(1,1,n,a,b).count());
		}
	}
	return 0;
}

或者指导下正确姿势?

2020/10/30 22:54
加载中...