TLE 60pts 求助
查看原帖
TLE 60pts 求助
830990
roumeideclown楼主2025/2/3 14:43

块长取啥都过不了。

玄关。

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
constexpr int N=2e5+5;
int n,m,k,a[N],block,cnt[N];
ll sum,ans[N];
struct Query {
	int id,l,r;
} que[N];
bool cmp(Query &A,Query &B) {
	int posA=A.l/block,posB=B.l/block;
	if(A.l!=B.l) return A.l<B.l;
	if(A.l&1) return A.r>B.r;
	else return A.r<B.r;
}
inline void add(int x) {
	sum+=cnt[a[x]^k];
	cnt[a[x]]++;
}
inline void del(int x) {
	cnt[a[x]]--;
	sum-=cnt[a[x]^k];
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	block=sqrt(n),cnt[0]=1;
	for(int i=1;i<=n;i++) cin>>a[i],a[i]^=a[i-1];
	for(int i=1;i<=m;i++) {
		que[i].id=i;
		cin>>que[i].l>>que[i].r;
	}
	sort(que+1,que+m+1,cmp);
	int l=0,r=0;
	for(int i=1;i<=m;i++) {
		int ql=que[i].l-1,qr=que[i].r;
		while(l<ql) del(l++);
		while(l>ql) add(--l);
		while(r<qr) add(++r);
		while(r>qr) del(r--); 
		ans[que[i].id]=sum;
	}
	for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
	return 0;
}

2025/2/3 14:43
加载中...