P5522求卡常
  • 板块灌水区
  • 楼主ssl_lwz
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/12 18:33
  • 上次更新2023/11/2 21:11:54
查看原帖
P5522求卡常
484751
ssl_lwz楼主2023/9/12 18:33
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int t[31][N],n,m,q,tq[31][N],ans;
char a[N][31];

inline void add(int x,int y,int i){
	for(;x<=m;x+=x&-x)
	  t[i][x]+=y;
}
inline int ser(int x,int i){
	int ans=0;
	for(;x;x-=x&-x)
	  ans+=t[i][x];
	return ans; 
}
inline int get(int l,int r,int i){
	int ans=ser(r,i)-ser(l-1,i);
	return ans;
}
inline void _add(int x,int y,int i){
	for(;x<=m;x+=x&-x)
	  tq[i][x]+=y;
}
inline int _ser(int x,int i){
	int ans=0;
	for(;x;x-=x&-x)
	  ans+=tq[i][x];
	return ans; 
}
inline int _get(int l,int r,int i){
	return _ser(r,i)-_ser(l-1,i);
}
signed main(){
    ios::sync_with_stdio(false);
	cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++)
		  cin>>a[i][j];
    }
    for(int i=1;i<=m;i++)
      for(int j=1;j<=n;j++){
      	if(a[i][j]=='1')
      	  add(i,1,j);
      	else if(a[i][j]=='?')
      	  _add(i,1,j);
	  }
	for(int i=1,opt,l,r;i<=q;i++){
		cin>>opt>>l;
		if(opt==0){
			cin>>r;
			int sum=1;
			for(int j=1;j<=n;j++)
			{
				if(get(l,r,j)+_get(l,r,j)!=r-l+1&&get(l,r,j)){
					sum=0;
					break;
				}
				if(_get(l,r,j)==r-l+1)
				  sum*=2;
			}
		    if(sum)  ans^=sum;
		}
		else{
			char s[31];
			cin>>s+1;
			for(int j=1;j<=n;j++){
				if(a[l][j]=='?')
				  _add(l,-1,j);
				if(a[l][j]=='1')
				  add(l,-1,j);
			}
			for(int j=1;j<=n;j++){
				if(s[j]=='?')
				  _add(l,1,j);
				if(s[j]=='1')
				  add(l,1,j);
			}
			for(int j=1;j<=n;j++)  a[l][j]=s[j];
		}
	}
	return cout<<(ans^0),0;
}
2023/9/12 18:33
加载中...