社区讨论

WA 玄关 求hack

P4462[CQOI2018] 异或序列参与者 5已保存回复 15

讨论操作

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

当前回复
15 条
当前快照
1 份
快照标识符
@mhj2ujya
此快照首次捕获于
2025/11/03 19:49
4 个月前
此快照最后确认于
2025/11/03 20:41
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int unit;
struct node{
	int l,r,id;
}ask[N];
int n,m,k;
int a[N],sum[N];
bool cmp(node x,node y){
	if(x.l/unit!=y.l/unit) return x.l<y.l;
	if((x.l/unit)%2==1) return x.r<y.r;
	return x.r>y.r;
}
int ans[N],nowl,nowr,tot;
int cnt[N];
void solve(int l,int r,int id){
	while(nowl<l){
		int c=sum[nowl];
		cnt[c]--;
		tot-=cnt[c^k];
		nowl++;
	}
	while(nowl>l){
		int c=sum[nowl-1];
		tot+=cnt[c^k];
		cnt[c]++;
		nowl--;
	}
	while(nowr<r){
		int c=sum[nowr+1];
		tot+=cnt[c^k];
		cnt[c]++;
		nowr++;
	}
	while(nowr>r){
		int c=sum[nowr];
		cnt[c]--;
		tot-=cnt[c^k];
		nowr--;
	}
	ans[id]=tot;
	return;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>k;
	unit=sqrt(n);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]^a[i];
	for(int i=1;i<=m;i++){
		cin>>ask[i].l>>ask[i].r;
		ask[i].id=i;
	}
	sort(ask+1,ask+1+m,cmp);
	nowl=nowr=0,tot=(k==0?1:0),cnt[0]=1;
	for(int i=1;i<=m;i++) solve(ask[i].l-1,ask[i].r,ask[i].id);
	for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
	return 0;
}

回复

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

正在加载回复...