社区讨论

萌新刚学莫队求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjudxat
此快照首次捕获于
2025/11/04 08:40
4 个月前
此快照最后确认于
2025/11/04 08:40
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;
const int N = 1e6+10;
int n, m, ans[N], b[N], cnt[N], sum, k, len;

struct node {
	int l, r, num, id;
	bool operator < (const node &x) const {
		if (num != x.num) return l < x.l;
		else {
			if (num & 1) return r < x.r;
			else return r > x.r;
		}
	}
} a[N];

void add(int x) {
	sum += cnt[b[x] ^ k];
	cnt[b[x]]++;
	return ;
}

void del(int x) {
	cnt[b[x]]--;
	sum -= cnt[b[x] ^ k];
	return ;
}

signed main() {
	cin >> n >> m >> k;
	len = cbrt(n*n);
	for (int i = 1; i <= n; i++)
		cin >> b[i], b[i] = b[i] ^ b[i - 1];
	for (int i = 1; i <= m; i++) {
		cin >> a[i].l >> a[i].r;
		a[i].l--;
		a[i].num = a[i].l / len + 1, a[i].id = i;
	}
	sort(a + 1, a + 1 + n);
	int l = 0, r = 0;
	cnt[0] = 1;
	sum = (k == 0);
	for (int i = 1; i <= m; i++) {
		while (l > a[i].l) add(--l);
		while (r < a[i].r) add(++r);
		while (l < a[i].l) del(l++);
		while (r > a[i].r) del(r--);
		ans[a[i].id] = sum;
	}
	for (int i = 1; i <= m; i++)
		cout << ans[i] << endl;
	return 0;
}
1、2、3 WA了,不知道哪里错了。

回复

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

正在加载回复...