打卡2

XOR and Favorite Number

这个题能改变成加法。

第三个while始终觉得区间变长了,看了一下午还是很难理解。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 50;
typedef long long ll;
int a[maxn];
struct node
{
    int l, r;
    int block;
    int id;
};
node q[maxn];
bool cmp(node A, node B)
{
    if(A.block == B.block) return A.r < B.r;
    else return A.l < B.l;
}
ll out[maxn];
int sum[maxn];
ll cnt[1 << 20];
int main()
{
    int n, m, k; scanf("%d %d %d", &n, &m, &k);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++)
    {
        sum[i] = sum[i - 1] ^ a[i];
    }
    int block = sqrt(n);
    for(int i = 1; i <= m; i++)
    {
        scanf("%d %d", &q[i].l, &q[i].r);
        q[i].block = q[i].l / block;
        q[i].id = i;
    }
    sort(q + 1, q + m + 1, cmp);
    memset(cnt, 0, sizeof(cnt));
    int l = 1, r = 0;
    ll ans = 0;
    cnt[0]++;
    for(int i = 1; i <= m; i++)
    {
        while(r < q[i].r)
        {
            r++;
            ans += cnt[sum[r] ^ k];
           // printf("%d %d %d\n", sum[r], sum[r] ^ k, cnt[sum[r] ^ k]);
            cnt[sum[r]]++;
        }
       //printf("%d\n", ans);
        while(r > q[i].r)
        {
            cnt[sum[r]]--; ///先把我自己去掉,以免产生影响
            ans -= cnt[sum[r] ^ k];
            r--;
        }
        while(l < q[i].l)
        {
            cnt[sum[l - 1]]--; ///也是先把我自己去掉
            ans -= cnt[sum[l - 1] ^ k];
            l++;
        }
        while(l > q[i].l)
        {
            l--;
            ans += cnt[sum[l - 1] ^ k];
            cnt[sum[l - 1]]++;
        }
        out[q[i].id] = (ans >= 0LL ? ans : 0LL);
    }
    for(int i = 1; i <= m; i++)
    {
        printf("%lld\n", out[i]);
    }
    return 0;
}


/*
6 1 3
1 2 1 1 0 3
3 4
*/
Code

CodeForces - 294E

今天各种保研事情,没做上,明天继续补。

猜你喜欢

转载自www.cnblogs.com/littlepear/p/9588162.html