萌新求助简单题卡常
查看原帖
萌新求助简单题卡常
631787
Watanabe楼主2023/11/12 08:20

没想到异或哈希,于是写了个分块套bitset,但是第十一个点T了,求大佬教教怎么卡常(

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#define re register

using namespace std;
const int N=2e5+10,M=4e2+60,K=1e4+10;
int n,a[N],Q,ql,qr,B;

int m,bnum,belong[N],L[M],R[M];

bitset<N> b[M],c,d[K+10];

struct Node{
	int v,id;
}A[N];
int num,fac[N];
inline bool cmp(Node X,Node Y)
{
	return X.v<Y.v;
}
inline void init()
{
	for(re int i=1;i<=n;++i) A[i]={a[i],i};
	sort(A+1,A+n+1,cmp);
	for(re int i=1;i<=n;++i)
	{
		if(A[i].v!=A[i-1].v) fac[++num]=A[i].v;
		a[A[i].id]=num;
	}
	
	m=sqrt(n);
	for(re int i=1;i<=n;++i) belong[i]=(i-1)/m+1;
	bnum=(n-1)/m+1;
	for(re int i=1;i<=bnum;++i) L[i]=(i-1)*m+1,R[i]=i*m;
	R[bnum]=n;
	for(re int i=1;i<=bnum;++i)
	{
		for(re int j=L[i];j<=R[i];++j)
		{
			b[i].flip(a[j]);
			if(j<=K) d[j].flip(a[j]);
		}
	}
	for(re int i=2;i<=bnum;++i) b[i]=b[i]^b[i-1];
	for(re int i=1;i<=K;++i) d[i]^=d[i-1];
	B=n/m+n/64;
	B*=5; 
}
int s[N],tot;
int cnt[N];
inline int ask(int l,int r)
{
	int bl=belong[l],br=belong[r],res=1e9+1,tmp;
	tot=0;
	if(r<=K)
	{
		c=d[r]^d[l-1];
		tmp=c._Find_first(); 
		return tmp==c.size() ? 0 : tmp ;
	}
	if(r-l+1<=B)
	{
		for(re int i=l;i<=r;++i) 
		{
			if(!cnt[a[i]]) s[++tot]=a[i];
			++cnt[a[i]];
		}
		for(re int i=1;i<=tot;++i) 
		{
			if(cnt[s[i]]%2==1) res=min(res,s[i]);
			cnt[s[i]]=0;
		}
		return res==1e9+1 ? 0 : res ;
	}
	for(re int i=l;i<=R[bl];++i) 
	{
		if(!cnt[a[i]]) s[++tot]=a[i];
		++cnt[a[i]];
	}
	for(re int i=L[br];i<=r;++i)
	{
		if(!cnt[a[i]]) s[++tot]=a[i];
		++cnt[a[i]];
	}
	c=b[br-1]^b[bl];
	for(re int i=1;i<=tot;++i) 
	{
		if(cnt[s[i]]%2==1)
		{
			if(!c[s[i]]) res=min(res,s[i]),c[s[i]]=1;
			else c[s[i]]=0;
		}
		else
		{
			if(c[s[i]]) res=min(res,s[i]),c[s[i]]=1;
			else c[s[i]]=0;
		}
		cnt[s[i]]=0;
	}
	tmp=c._Find_first();
	if(tmp==c.size()) tmp=-1;
	res=min(res, tmp==-1 ? res : tmp);
	return res==1e9+1 ? 0 : res ;
}
int ans;

inline int read(){char cr=getchar();int x_=0,fui=1;while(cr<48){if(cr=='-')fui=-1;cr=getchar();}while(cr>47)x_=(x_*10)+(cr^48),cr=getchar();return x_*fui;}
inline void mwrite(int aq){if(aq>9)mwrite(aq/10);putchar((aq%10)|48);}
inline void write(int af,char cr){mwrite(af<0?(putchar('-'),af=-af):af);putchar(cr);}

signed main()
{
    n=read();
    for(re int i=1;i<=n;++i) a[i]=read();
    Q=read();
	init();
    while(Q--)
    {
    	ql=read()^ans,qr=read()^ans;
    	//if(ql>qr) swap(ql,qr);
    	ans=fac[ask(ql,qr)];
    	write(ans,'\n');
    	//if(n==100) cout<<ql<<" "<<qr<<"\n";
	}
	return 0;
} 
2023/11/12 08:20
加载中...