zoukankan      html  css  js  c++  java
  • Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法

    链接:

    http://codeforces.com/contest/617/problem/E

    题意:

    给出一个长度为n的数组和一个k,每次询问一个区间,问你有多少子区间的异或和为k

    题解:

    莫队算法,先算出前缀和(异或和),然后就是暴力的莫队了

    代码:

    31 struct node {
    32     int l, r, id;
    33 }q[MAXN];
    34 
    35 int n, m, k;
    36 int a[MAXN];
    37 int pos[MAXN];
    38 ll ans[MAXN];
    39 ll sum[2000007];
    40 
    41 bool cmp(node a, node b) {
    42     if (pos[a.l] == pos[b.l]) return a.r < b.r;
    43     return pos[a.l] < pos[b.l];
    44 }
    45 
    46 int L = 1, R = 0;
    47 ll Ans = 0;
    48 
    49 void add(int x) {
    50     Ans += sum[a[x] ^ k];
    51     sum[a[x]]++;
    52 }
    53 
    54 void del(int x) {
    55     sum[a[x]]--;
    56     Ans -= sum[a[x] ^ k];
    57 }
    58 
    59 int main() {
    60     ios::sync_with_stdio(false), cin.tie(0);
    61     cin >> n >> m >> k;
    62     int sz = sqrt(n);
    63     rep(i, 1, n + 1) {
    64         cin >> a[i];
    65         a[i] ^= a[i - 1];
    66         pos[i] = i / sz;
    67     }
    68     rep(i, 0, m) {
    69         cin >> q[i].l >> q[i].r;
    70         q[i].id = i;
    71     }
    72     sort(q, q + m, cmp);
    73     sum[0] = 1;
    74     rep(i, 0, m) {
    75         while (L < q[i].l) del(L - 1), L++;
    76         while (L > q[i].l) L--, add(L - 1);
    77         while (R < q[i].r) R++, add(R);
    78         while (R > q[i].r) del(R), R--;
    79         ans[q[i].id] = Ans;
    80     }
    81     rep(i, 0, m) cout << ans[i] << endl;
    82     return 0;
    83 }
  • 相关阅读:
    APNS 证书生成注意事项
    Remove a Submodule within git
    Quartz.NET
    Linux.net && mono
    系统整理qt笔记1
    串口通讯之rs232 c++版本
    串口通信 之 linux固定串口别名的两种方法
    系统整理qt笔记3
    串口通信+进制基础+位运算
    qt(二)
  • 原文地址:https://www.cnblogs.com/baocong/p/6797584.html
Copyright © 2011-2022 走看看