TLE30分求调
查看原帖
TLE30分求调
948995
yinxiangbo2027楼主2025/1/19 16:05

检查了n边,不知道为什么TLE了

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,a[500005],c[1000005],b[500005],answer[500005],bel[500005];
long long ans;
int rd(){
	int x=0;char ch=getchar();
	while(!(ch>='0' && ch<='9'))ch=getchar();
	while((ch>='0' && ch<='9')){
		x=(x<<1)+(x<<3)+int(ch-'0');
		ch=getchar();
	}
	return x;
}
struct node{
	long long l,r,id;
}q[500005];
bool cmp(node l,node r){
	return (bel[l.l]^bel[r.l])?bel[l.l]<bel[r.l]:((bel[l.l]&1)?l.r<r.r:r.r>r.r);
}
void build(){
	int kk=sqrt(n);
	for(int i=1;i<=n;i++){
		bel[i]=(i+kk-1)/kk;
	}
	return ;
}
void jia(long long i){
	ans+=c[b[i]];
	c[a[i]]++;
	return ;
}
void jian(long long i){
	c[a[i]]--;
	ans-=c[b[i]];
	return ;
}
int main(){
	n=rd();
	m=rd();
	k=rd();
	build();
	for(long long i=1;i<=n;i++){
		a[i]=rd();
		a[i]=a[i]^a[i-1];
		b[i]=a[i]^k;
	}
	for(long long i=1;i<=m;i++){
		q[i].l=rd();
		q[i].r=rd();
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmp);
	long long ll=0,rr=0;
	c[0]++;
	for(long long i=1;i<=m;i++){
		while(rr<q[i].r){
			jia(++rr);
		}
		while(rr>q[i].r){
			jian(rr--);
		}
		while(ll<q[i].l-1){
			jian(ll++);
		}
		while(ll>q[i].l-1){
			jia(--ll);
		}
		answer[q[i].id]=ans;
	}
	for(long long i=1;i<=m;i++){
		cout<<answer[i]<<"\n";
	}
	return 0;
}
2025/1/19 16:05
加载中...