P4462莫队WA求助
  • 板块学术版
  • 楼主T20201126
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/9/10 16:25
  • 上次更新2023/10/27 12:07:09
查看原帖
P4462莫队WA求助
419474
T20201126楼主2022/9/10 16:25
#include<bits/stdc++.h>
using namespace std;
#define int long long  
const int N=100005;
inline int read();
int n,m,k,a[N],pos[N],lef,righ,res,cnt,yh[N],num[N*2];
struct node {
	int l,r,ans,ID;
}q[N];

bool cmp(node x,node y){
	return x.ID<y.ID;
}
bool cm(node x,node y){
	return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
}
inline void add(int w){
	res+=num[yh[w]^k];++num[yh[w]];
}
inline void sub(int w){
	--num[yh[w]];res-=num[yh[w]^k];
}

signed main()
{
	n=read();m=read();k=read();
	cnt=sqrt(n);
	for(int i=1;i<=n;++i) {
		a[i]=read();
		pos[i]=(i-1)/cnt+1;
		yh[i]=a[i-1]^a[i];
	}
	for(int i=1;i<=m;++i)
	{
		q[i].l=read();q[i].r=read();q[i].l--;
		q[i].ID=i;
	}
	sort(q+1,q+1+m,cm);
	/*for(int i=1;i<=m;++i) 
	{
		printf("%lld%lld%lld\n",q[i].l,q[i].r,q[i].ID);
	}*/
	lef=1;righ=0;res=0;
	for(int i=1;i<=m;++i)
	{
		while(q[i].l<lef) add(--lef);
		while(q[i].r>righ) add(++righ);
		while(q[i].l>lef) sub(lef++);
		while(q[i].r<righ) sub(righ--); 
		q[i].ans=res;	
	}
	sort(q+1,q+1+m,cmp);
	for(int i=1;i<=m;++i) printf("%lld\n",q[i].ans);
	return 0;
}
inline int read(){
	int x=0;int b=1;char c=getchar();
	while(!isdigit(c)){
		if(c=='-') b=-1;
		c=getchar();
	}
	while(isdigit(c)){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*b;
}
2022/9/10 16:25
加载中...