CF617E XOR and Favorite Number
生活随笔
收集整理的這篇文章主要介紹了
CF617E XOR and Favorite Number
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF617E XOR and Favorite Number
已知一個序列 \(a_1,\ a_2,\ \cdots,\ a_n\) 和 \(k\) ,\(m\) 次詢問給出 \(l,\ r\) ,求 \(\displaystyle\sum_{i=l}^r\sum_{j=i}^r[a_x\oplus a_{x+1}\oplus \cdots \oplus a_y=k]\)
\(n,\ m\leq10^5,\ 0\leq a_i,\ k\leq10^6\)
莫隊
重題 bzoj5301 [CQOI2018]異或序列
考慮維護一個異或前綴和,問題就轉化為了:區間 \([l-1,\ r]\) 中,有多少對數異或和為 \(k\)。莫隊開桶記錄即可
注意數組空間大小以及 \(long\ long\)
時間復雜度 \(O(n\sqrt n)\)
#include <bits/stdc++.h> using namespace std;typedef long long ll; const int maxn = 1e5 + 10; int n, m, k, sz, a[maxn], bl[maxn], cnt[maxn * 20]; ll now, ans[maxn]; struct node {int l, r, tid;bool operator < (const node& o) const {return bl[l] != bl[o.l] ? l < o.l : r > o.r;} } q[maxn];void add(int x) { now += cnt[x ^ k], cnt[x]++; } void del(int x) { cnt[x]--, now -= cnt[x ^ 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], bl[i] = (i - 1) / sz + 1;}for (int i = 1; i <= m; i++) {scanf("%d %d", &q[i].l, &q[i].r), q[i].l--, q[i].tid = i;}sort(q + 1, q + m + 1);int l = 0, r = -1;for (int i = 1; i <= m; i++) {while (q[i].l < l) add(a[--l]);while (q[i].r > r) add(a[++r]);while (q[i].l > l) del(a[l++]);while (q[i].r < r) del(a[r--]);ans[q[i].tid] = now;}for (int i = 1; i <= m; i++) {printf("%I64d\n", ans[i]);}return 0; }轉載于:https://www.cnblogs.com/Juanzhang/p/10345401.html
總結
以上是生活随笔為你收集整理的CF617E XOR and Favorite Number的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HackerRank数据库题目练习(2)
- 下一篇: 文本分类的一种对抗训练方法