求问
查看原帖
求问
572133
潘德理2010楼主2024/2/26 22:43

为什么以下代码无法通过:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int sz;
struct nd1{
	int l,r,v;
	bool operator<(nd1 a){
		if(l/sz!=a.l/sz) return l<a.l;
		if((l/sz)&1) return r<a.r;
		return r>a.r;
	}
}q[100010];
int cnt[100010];
ll ans[100010],res;
int n,m,k,a[100010],l,r=-1;
void add(int u){
	res+=cnt[u^k];
	cnt[u]++;
}
void del(int u){
	cnt[u]--;
	res-=cnt[u^k];
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	sz=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i]^=a[i-1];
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].v=i;
		q[i].l--;
	}
	sort(q+1,q+m+1);
	for(int i=1;i<=m;i++){
		while(l>q[i].l) add(a[--l]);
		while(r<q[i].r) add(a[++r]);
		while(l<q[i].l) del(a[l++]);
		while(r>q[i].r) del(a[r--]);
		ans[q[i].v]=res;
	}
	for(int i=1;i<=m;i++){
		printf("%lld\n",ans[i]);
	}
}

但我将

void add(int u){
	cnt[u]++;
	res+=cnt[u^k];
}
void del(int u){
	res-=cnt[u^k];
	cnt[u]--;
}

改为

void add(int u){
	res+=cnt[u^k];
	cnt[u]++;
}
void del(int u){
	cnt[u]--;
	res-=cnt[u^k];
}

后就 AC 了?

有大佬可以讲述一下上面的代码的错误之处吗?

2024/2/26 22:43
加载中...