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)都可行。

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

  • 相关阅读:
    m113
    无题
    m102 SE赛
    m101 真*sb($huge 全场最瞎$)
    m100 的坑
    m99 然而并没有想出来标题!
    m98 lsc rp-- 赛
    csps2019AFO祭
    csps考前的一些总结(然而可能并没有用)
    低错总结
  • 原文地址:https://www.cnblogs.com/Scx117/p/9112954.html
Copyright © 2011-2022 走看看