zoukankan      html  css  js  c++  java
  • Codeforces Round #539 (Div. 2)

    Problem   Codeforces Round #539 (Div. 2) - C. Sasha and a Bit of Relax

    Time Limit: 2000 mSec

    Problem Description

    Input

    The first line contains one integer n (2n310^5) — the size of the array.

    The second line contains n integers a1,a2,,an (0ai<2^20) — array itself.

    Output

    Print one integer — the number of funny pairs. You should consider only pairs where rl+1is even number.

    Sample Input

    5
    1 2 3 4 5

    Sample Output

    1

    题解:这个题只要知道异或满足

      if A ^ B == C then A == B ^ C 这个性质

    就会很简单,首先处理出异或前缀和是很自然的,之后对于满足条件的pair,必定有f(r) == f(l - 1),f即异或前缀和,这是必要条件,同时也是充分的,充分性同样利用这个性质

      若有a[l] ^ a[l+1] ^ ... ^ a[k] = a[k+1] ^ a[k + 2] ^ ... ^ a[r], 那么就可以利用上述性质使得k == mid,因为如果k > mid,那么,等式两边同时异或a[k]即可将a[k]从等式左边变到右边,继续进行这种操作知道k == mid,对于k < mid,同理,因此现在就是找满足异或前缀和相等的pair,并且要使得r - l + 1是偶数,也就是r 和 l - 1同奇偶,这个问题很好解决,统计每种异或前缀和的个数(对每个值按下标奇偶性分类)即可计算出最终结果,由a数组数据的范围可知异或前缀和 < 2^21,复杂度是完全可以接受的,别忘了开 long long。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define REP(i, n) for (int i = 1; i <= (n); i++)
     6 #define sqr(x) ((x) * (x))
     7 
     8 const int maxn = 2000000 + 100;
     9 const int maxm = 200000 + 100;
    10 const int maxs = 10000 + 10;
    11 
    12 typedef long long LL;
    13 typedef pair<int, int> pii;
    14 typedef pair<double, double> pdd;
    15 
    16 const LL unit = 1LL;
    17 const int INF = 0x3f3f3f3f;
    18 const double eps = 1e-14;
    19 const double inf = 1e15;
    20 const double pi = acos(-1.0);
    21 const int SIZE = 100 + 5;
    22 const LL MOD = 1000000007;
    23 
    24 LL cnt[maxn][2];
    25 int n;
    26 
    27 int main()
    28 {
    29     ios::sync_with_stdio(false);
    30     cin.tie(0);
    31     //freopen("input.txt", "r", stdin);
    32     //freopen("output.txt", "w", stdout);
    33     cin >> n;
    34     int pre = 0, x;
    35     for (int i = 1; i <= n; i++)
    36     {
    37         cin >> x;
    38         pre ^= x;
    39         //cout << pre << endl;
    40         cnt[pre][i % 2]++;
    41     }
    42     LL ans = 0;
    43     cnt[0][0]++;
    44     for (int i = 0; i < maxn; i++)
    45     {
    46         ans += cnt[i][0] * (cnt[i][0] - 1) / 2;
    47         ans += cnt[i][1] * (cnt[i][1] - 1) / 2;
    48     }
    49     cout << ans << endl;
    50     return 0;
    51 }
  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/npugen/p/10791788.html
Copyright © 2011-2022 走看看