zoukankan      html  css  js  c++  java
  • arc098D Xor Sum 2

    题意:给你一个数列,问有多少对(l,r)满足A[l]+A[l+1]+...+A[r]=A[l]^A[l+1]^...^A[r]?

    标程:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 const int N=200005;
     5 int n,l;
     6 ll ans,sum,a[N];
     7 int main()
     8 {
     9     scanf("%d",&n);l=1;
    10     for (int i=1;i<=n;i++) 
    11     {
    12         scanf("%lld",&a[i]);
    13         while ((sum^a[i])!=sum+a[i]) sum^=a[l++];
    14        ans+=i-l+1;sum^=a[i];
    15     }
    16     printf("%lld
    ",ans);
    17     return 0;
    18 }

    题解:性质

    有(A+B)-(A^B)=2(A&B)。

    由此我们推广一下,按位考虑异或性质,每一位最多只有一个1。或者说,进位加法和不进位加法相等的情况只有不进位的情况。

    如果[l,r]区间的加法不进位,那么以r为右端点,左端点在[l,r]中的(l,r)都可行。

    新加入一个右端点,那么有可能出现进位,往右移动左端点,使之不进位。由此可见,区间单调。

  • 相关阅读:
    HDOJ 1093
    HDOJ 1089
    HDOJ 1094
    qsort函数
    HDOJ 1092
    HDOJ 1091
    NYOJ 448(贪心)
    HDOJ 1090
    HDOJ 1097(幂取模)
    winform用户输入查询与拼音首字母的结合,提高用户的操作体验
  • 原文地址:https://www.cnblogs.com/Scx117/p/9112954.html
Copyright © 2011-2022 走看看