01tire vector写法 MLE 40pts求调
查看原帖
01tire vector写法 MLE 40pts求调
319995
THUD楼主2024/6/24 18:27
#include<bits/stdc++.h>
#define px first
#define py second
#define mkp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ostream_iterator<ll> output(cout," ");
const int N=100005,V=1e7+5;
//const int MOD=;
typedef pair<int,int> P;
template<typename T>
class Trie01{
	struct Node{
		int son[2],sum;
		Node(){sum=son[0]=son[1]=0;}
	};
	vector<Node> a;
	int n;
	static const int rt=1;
  public:
  	Trie01(int si): n(si-1),a(2){}
	/*void print(){
		for(int i=0;i<a.size();i++)
			fprintf(stderr,"a[%d]={%d,%d,%d}\n",i,a[i].son[0],a[i].son[1],a[i].sum);
	}*/
	void insert(const T& x,const int& v=1){
		int num=rt;
		for(int i=n,cur;i>=0;i--){
			a[num].sum+=v;
			cur=x>>i&1;
			if(!a[num].son[cur]) a.emplace_back(),a[num].son[cur]=a.size()-1;
			num=a[num].son[cur];
		}
		a[num].sum+=v;
	}
	void erase(const T& x){insert(x,-1);}
	int depth() const{return n+1;}
	int size() const{return a[rt].sum;}
	void clear(){a.clear();a.emplace_back();}
	int count(const T& x){
		int num=rt;
		for(int i=n,cur;i>=0;i--){
			cur=x>>i&1;
			num=a[num].son[cur];
			if(!num) return 0;
		}
		return a[num].sum;
	}
	int rank(const T& x){
		int ans=1;
		for(int i=n,num=rt;i>=0;i--){
			if(x>>i&1) ans+=a[a[num].son[0]].sum,num=a[num].son[1];
			else num=a[num].son[0];
			if(!num) break;
		}
		return ans;
	}
	T nth_element(int k){
		T ans=0;
		for(int i=n,num=rt;i>=0;i--)
			if(a[a[num].son[0]].sum>=k) num=a[num].son[0];
			else ans|=(1<<i),k-=a[a[num].son[0]].sum,num=a[num].son[1];
		return ans;
	}
	T lower_bound(const T& x){return nth_element(rank(x));}
	T upper_bound(const T& x){return nth_element(rank(x)-1);}
};
Trie01<int> a(30);
int n,m,ans;
signed main(){
	/*a.insert(3),a.insert(5),a.insert(3),a.insert(7,3),a.print();
	cerr<<a.count(3)<<" "<<a.count(2)<<" "<<a.count(7)<<" "<<a.count(1)<<endl;
	for(int i=0;i<=8;i++) cerr<<a.rank(i)<<" \n"[i==8];
	for(int i=0;i<=8;i++) cerr<<a.nth_element(i)<<" \n"[i==8];*/
	scanf("%d%d",&n,&m);
	for(int i=1,t;i<=n;i++) scanf("%d",&t),a.insert(t);
	for(int i=1,op,x,lst=0;i<=m;i++){
		scanf("%d%d",&op,&x);
		x^=lst;
		if(op==1) a.insert(x);
		if(op==2) a.erase(x);
		if(op==3) lst=a.rank(x);
		if(op==4) lst=a.nth_element(x);
		if(op==5) lst=a.nth_element(a.rank(x)-1);
		if(op==6) lst=a.nth_element(a.rank(x+1));
		if(op>=3) ans^=lst;
	}
	printf("%d",ans);
	/*for(int i=1;i<=7;i++) cerr<<a.nth_element(i)-V<<" \n"[i==7];
	cerr<<a.rank(493598+V)<<endl;*/
	return 0;
}

弱化版能过

2024/6/24 18:27
加载中...