zoukankan      html  css  js  c++  java
  • 【CQOI2018】异或序列

    题目描述

    已知一个长度为n的整数数列 $a_1,a_2,...,a_n$​,给定查询参数l、r,问在 $a_l,a_{l+1},...,a_r$​ 区间内,有多少子序列满足异或和等于k。也就是说,对于所有的 x,y $(lle xle yle r)$,能够满足$a_xigoplus a_{x+1} igoplus ... igoplus a_y = k$ 的 x,y 有多少组。

    思路

    记一个异或前缀和 val,问题就转换成有多少对数异或等于 k
    直接上莫队

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100000 + 10;
    int n,m,k,block,cnt[maxn],val[maxn];
    long long tot,ans[maxn];
    struct Query {
        int l,r,num;
        inline bool operator < (Query cmp) const {
            if (l/block != cmp.l/block) return l/block < cmp.l/block;
            return r/block < cmp.r/block;
        }
    }q[maxn];
    inline void add(int x) { tot += cnt[x^k]; cnt[x]++; }
    inline void del(int x) { tot -= cnt[x^k]+(!k); cnt[x]--; }
    int main() {
        scanf("%d%d%d",&n,&m,&k);
        block = sqrt(n);
        for (int i = 1;i <= n;i++) scanf("%d",&val[i]),val[i] ^= val[i-1];
        for (int i = 1;i <= m;i++) {
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].l--;
            q[i].num = i;
        }
        sort(q+1,q+m+1);
        int l = 1,r = 0;
        for (int i = 1;i <= m;i++) {
            while (l > q[i].l) add(val[--l]);
            while (l < q[i].l) del(val[l++]);
            while (r < q[i].r) add(val[++r]);
            while (r > q[i].r) del(val[r--]);
            ans[q[i].num] = tot;
        }
        for (int i = 1;i <= m;i++) printf("%lld
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    ASP.NET中使用附文本框插件
    HttpModules配置事项
    ASP.NET页面缓冲
    在ASP.NET中备份数据库以及还原(不成熟)
    python List使用
    SSH登录详解
    Vue.js使用-http请求
    Vue.js使用-组件示例(实现数据的CRUD)
    Vue.js使用-组件(下篇)
    Vue.js使用-组件(上篇)
  • 原文地址:https://www.cnblogs.com/lrj124/p/8986001.html
Copyright © 2011-2022 走看看