欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LOJ 6144

程序员文章站 2024-03-02 21:46:10
...

https://loj.ac/problem/6144

在某位and 0或者or 1之后就全部相等了,这意味着这一位没有比较的必要了

可以重构可持久化01trie

最多log次

#include<bits/stdc++.h>
#define file(KSCN) freopen(KSCN".in","r",stdin),freopen(KSCN".out","w",stdout)
using namespace std;
typedef long long ll;
namespace IO{
	const int ios=1<<17;
	char R[ios],*Rc=R,*RB=R;int pass;
	inline char gec(){return(Rc==RB&&(RB=(Rc=R)+fread(R,1,ios,stdin),Rc==RB))?EOF:*Rc++;}
	template<typename Tp>inline int read(Tp&A){
		static char c,sg;c=gec();sg=0;A=0;
		while(!isdigit(c)&&c!=EOF)sg|=(c=='-'),c=gec();
			if(c==EOF)return EOF;
		while(isdigit(c))A=(A<<3)+(A<<1)+(c^'0'),c=gec();
		return A=sg?-A:A,0;
	}
	void getstr(char*cur){
		char ch=gec();
		while(isspace(ch))ch=gec();
		while(!isspace(ch))*cur++=ch,ch=gec();
		*cur=0;
	}
	inline int read(){return read(pass),pass;}
}
using IO::gec;using IO::read;using IO::getstr;
const int N=2e6+5;
unsigned vis,wow,op;
int s[N][2],alloc,sz[N];
int w[N],rt[N];
int n,m;
int Querys(int x,int y,int k){
	int ret=0;
	for(int i=30;~i;i--){
		if(~vis>>i&1){
			int v=op>>i&1,
				scc=sz[s[y][v]]-sz[s[x][v]],
				to=(k<=scc)?0:(k-=scc,1);
			ret|=(to<<i);
			x=s[x][v^to],y=s[y][v^to];
		}
	}
	return ret|(vis&(wow));
}
void copys(int&b){
	++alloc;
	memcpy(s[alloc],s[b],sizeof(s[b]));
	sz[alloc]=sz[b];
	b=alloc;
}
void rebuild(){
	memset(s,0,sizeof(s));
	memset(sz,0,sizeof(sz));
	alloc=0;
	for(int k=1;k<=n;k++){
		int val=w[k],cur=rt[k-1];
		copys(cur);
		rt[k]=cur;
		for(int i=30;~i;i--)if(~vis>>i&1)
			copys(s[cur][val>>i&1]),
			sz[cur=s[cur][val>>i&1]]++;
	}
}
int main(){
	char opt[20];
	int val,l,r,k;
	read(n);read(m);
	for(int i=1;i<=n;i++)read(w[i]); 
	rebuild(); 
	while(m--){
		getstr(opt);
		if(opt[1]=='s'){
			read(l);
			read(r);
			read(k);
			printf("%d\n",Querys(rt[l-1],rt[r],k));
		}
		else{
			read(val);
			if(opt[1]=='o'){
				op^=val;
				wow^=val;
			}else{
				unsigned tmp=vis;
				if(opt[1]=='n')vis|=(~val),wow&=val;
				else vis|=val,wow|=val;
				if(vis!=tmp)rebuild();
			}
		}
	}
	return 0;
}

 

相关标签: 可持久化