社区讨论

站外题求助

学术版参与者 3已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@mdnubhui
此快照首次捕获于
2025/07/29 09:10
7 个月前
此快照最后确认于
2025/11/05 00:57
4 个月前
查看原帖
https://www.zhimaoi.cn/org/b3f41b76-6101-444a-9ddf-2aad7ce28b1f/problem/87c98f4b-29f4-495f-9e62-f28c1f2f85de/
使用莫队
CPP
#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;
}

回复

12 条回复,欢迎继续交流。

正在加载回复...