站外题求助
查看原帖
站外题求助
1411905
zhangyuchen201304楼主2025/7/29 09:08

https://www.zhimaoi.cn/org/b3f41b76-6101-444a-9ddf-2aad7ce28b1f/problem/87c98f4b-29f4-495f-9e62-f28c1f2f85de/

使用莫队

#include<bits/stdc++.h>
#define get(x) (((x)-1)/len)
using namespace std;
const int N=2e5+50;

long long a[N],ans[N],f[N],len,l,r;
long long res;
int n,m,k;

struct query{
	int l,r,id;
	bool operator < (query b){
		if(get(l)==get(b.l))return r<b.r;
		return get(l)<get(b.l);
	}
}q[N];

inline void add(int p){
	res+=f[a[p]^k];
	f[a[p]]++;
}

inline void del(int p){
	f[a[p]]--;
	res-=f[a[p]^k];
}

int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	len=sqrt(n);
	for(int i=1;i<=n;i++)cin>>a[i],a[i]^=a[i-1]; 
	for(int i=1;i<=m;i++){
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}
	sort(q+1,q+m+1);
	l=1,r=0;
	f[0]=1; 
	for(int i=1;i<=m;i++){
		while(l<q[i].l)del(l++);
		while(l>q[i].l)add(--l);
		while(r<q[i].r)add(++r);
		while(r>q[i].r)del(r--);
		ans[q[i].id]=res;
	}
	for(int i=1;i<=m;i++){
		cout<<ans[i]<<'\n';
	}
	return 0;
}

2025/7/29 09:08
加载中...