今天模拟赛T4拆位线段树求条
  • 板块学术版
  • 楼主Jadonyzx
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/8/29 18:32
  • 上次更新2025/8/30 10:36:44
查看原帖
今天模拟赛T4拆位线段树求条
1164775
Jadonyzx楼主2025/8/29 18:32
#include<bits/stdc++.h>
//#define getchar getchar_unlocked
//#define putchar putchar_unlocked
#define maxn 500005
#define int unsigned long long
using namespace std;
inline int read(){
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x;
}
inline void write(unsigned long long x){
	if(x>=10)write(x/10);
	putchar(x%10+'0');
	return;
}
int n,m,q,a[maxn],choose[maxn];
int cnt1[maxn*4],cnt0[maxn*4],len[maxn*4];
int tag_xor[maxn*4],tag_fg[maxn*4];
bool fg[maxn*4];
unsigned long long ans[maxn];
inline void pushdown(int id){
	if(fg[id]){
		cnt1[id<<1]=cnt0[id<<1]=0;
		if(tag_fg[id]==1)cnt1[id<<1]=len[id<<1];
		else cnt0[id<<1]=len[id<<1];
		
		cnt1[id<<1|1]=cnt0[id<<1|1]=0;
		if(tag_fg[id]==1)cnt1[id<<1|1]=len[id<<1|1];
		else cnt0[id<<1|1]=len[id<<1|1];
		
		fg[id]=false;fg[id<<1]=fg[id<<1|1]=true;
		tag_fg[id<<1]=tag_fg[id<<1|1]=tag_fg[id];
	}
	if(tag_xor[id]){
		tag_xor[id<<1]^=tag_xor[id];
		swap(cnt1[id<<1],cnt0[id<<1]);
		
		tag_xor[id<<1|1]^=tag_xor[id];
		swap(cnt1[id<<1|1],cnt0[id<<1|1]);
		
		tag_xor[id]=0;
	}
	return;
}
inline void pushup(int id){
	cnt0[id]=cnt0[id<<1]+cnt0[id<<1|1];
	cnt1[id]=cnt1[id<<1]+cnt1[id<<1|1];
	return;
}
inline void build(int id,int l,int r){
	tag_fg[id]=false;
	tag_xor[id]=0;len[id]=r-l+1;
	if(l==r){
		if(choose[l])cnt1[id]=1,cnt0[id]=0;
		else cnt1[id]=0,cnt0[id]=1;
		return;
	}
	int mid=(l+r)>>1;
	build(id*2,l,mid);build(id*2+1,mid+1,r);
	pushup(id);return;
}
inline void xor_(int id,int l,int r,int tol,int tor){
	if(tol<=l&&r<=tor){
		pushdown(id);
		tag_xor[id]^=1;
		swap(cnt0[id],cnt1[id]);
		return;
	}
//	if(l>tor||r<tol)return;
	int mid=(l+r)>>1;pushdown(id);
	if(tol<=mid)xor_(id<<1,l,mid,tol,tor);
	if(mid<tor)xor_(id<<1|1,mid+1,r,tol,tor);
	pushup(id);return;
}
inline void fugai(int id,int l,int r,int tol,int tor,int val){
	if(tol<=l&&r<=tor){
		pushdown(id);
		fg[id]=1;tag_fg[id]=val;
		if(val)cnt0[id]=0,cnt1[id]=len[id];
		else cnt1[id]=0,cnt0[id]=len[id];
		return;
	}
//	if(l>tor||r<tol)return;
	int mid=(l+r)>>1;pushdown(id);
	if(tol<=mid)fugai(id<<1,l,mid,tol,tor,val);
	if(mid<tor)fugai(id<<1|1,mid+1,r,tol,tor,val);
	pushup(id);return;
}
inline int query(int id,int l,int r,int tol,int tor){
//	if(l>tor||r<tol)return 0;
	if(tol<=l&&r<=tor)return cnt0[id];int mid=(l+r)>>1;pushdown(id);
	if(tor<=mid)return query(id<<1,l,mid,tol,tor);
	if(mid<tol)return query(id<<1|1,mid+1,r,tol,tor);
	return query(id<<1,l,mid,tol,tor)+query(id<<1|1,mid+1,r,tol,tor);
}
struct ask{int op,l,r,cz,x;}que[100005];
char Cz[maxn][100];
inline char get(){
	char ch=getchar();
	while(ch!='X'&&ch!='A'&&ch!='O')ch=getchar();
	return ch;
}
signed main(){
	n=read();m=read();q=read(); 
	for(int i=1;i<=n;++i)a[i]=read();
	for(int i=1;i<=m;++i)
	for(int j=0;j<63;++j)Cz[i][j]=get();
	for(int i=1;i<=q;++i){
		que[i].op=read();
		if(que[i].op==0)que[i].l=read(),que[i].r=read(),que[i].cz=read();
		else que[i].l=read(),que[i].r=read(),que[i].cz=read(),que[i].x=read();
	}
	for(int wei=0;wei<63;++wei){
		for(int i=1;i<=n;++i){
			if(a[i]&(1ull<<wei))choose[i]=1;
			else choose[i]=0;
		}
		build(1,1,n);
		for(int i=1;i<=q;++i){
			if(que[i].l>que[i].r)swap(que[i].l,que[i].r);
			if(que[i].op==0){
				int zero=query(1,1,n,que[i].l,que[i].r);
				int one=que[i].r-que[i].l+1-zero;
				if(Cz[que[i].cz][wei]=='A'){
					if(zero==0)
						ans[i]+=(1ull<<wei);
				}
				else if(Cz[que[i].cz][wei]=='O'){
					if(one>0)
						ans[i]+=(1ull<<wei);
				}
				else{
					if(one&1)
						ans[i]+=(1ull<<wei);
				}
			}
			else{
				bool delta=(que[i].x&(1ull<<wei));
				if(Cz[que[i].cz][wei]=='A'){
					if(!delta)fugai(1,1,n,que[i].l,que[i].r,0);
				}
				else if(Cz[que[i].cz][wei]=='O'){
					if(delta)fugai(1,1,n,que[i].l,que[i].r,1);
				}
				else{
					if(delta)xor_(1,1,n,que[i].l,que[i].r);
				}
			}
		}
	}
	for(int i=1;i<=q;++i)
		if(que[i].op==0){
			write(ans[i]);
			putchar('\n'); 
		}
	return 0;
}
2025/8/29 18:32
加载中...