偶數次子區間個數

2022-09-22 06:39:15 字數 1203 閱讀 3855

題意

有序列 \(s(n \leq 10^5, s_i \leq 10^6)\), 問區間 \([l, r]\) 內滿足每個數出現偶數次的子區間個數。

轉化想到區間出現每個數偶數次,那麼異或和一定為 0。

但是異或和為 0 的區間每個數不一定出現偶數個。

於是對相同的值賦乙個 \([0, 2^)\) 內隨機的值。

這樣出現衝突的概率很低。

莫隊剩下問題轉化為字首異或,找相同異或值的數即可。

**

#includeusing namespace std;

using ll = long long;

const int maxn = 1000010;

const int inf = 0x7fffffff;

const int mod = 1000000007;

template void read(t &x)

int n, m, len;

int a[maxn], cnt[maxn];

ll mp[maxn], xor[maxn], b[maxn];

struct ques q[maxn];

int ans[maxn], belong[maxn];

int main()

b[++ len] = 0;

a[0] = 1;

sort(b + 1, b + len + 1);

len = unique(b + 1, b + len + 1) - b - 1;

for (int i = 1; i <= n; i ++)

a[i] = lower_bound(b + 1, b + len + 1, xor[i]) - b;

cin >> m;

for (int i = 1; i <= m; i ++)

cin >> q[i].l >> q[i].r, q[i].l --, q[i].id = i;

sort (q + 1, q + m + 1, (ques x, ques y) );

int l = 0, r = -1, sum = 0;

for (int i = 1; i <= m; i ++)

for (int i = 1; i <= m; i ++)

cout << ans[i] << endl;

return 0;

}