首页 > 其他分享 >CF1879D Sum of XOR Functions

CF1879D Sum of XOR Functions

时间:2023-09-26 13:00:28浏览次数:48  
标签:CF1879D XOR 奇数 int res Sum 异或 区间 sum

异或和按位处理的典型例题。

要求所有子区间异或和乘区间长度的总和,朴素的方法是 \(O(n^2)\) 地枚举区间,显然无法通过。

因为涉及异或和,而异或运算不进位,故自然地想到把 \(a_i\) 写成二进制形式,单独研究每一位的贡献,最后再合并。这是处理此类问题的一般思路。

1. 二进制拆分

比方说,对于如下样例,我们把 \(a_i\) 写成二进制形式:

a[1] = 5  = 0101
a[2] = 11 = 1011
a[3] = 7  = 0111
a[4] = 4  = 0100

第 \(0\) 位可以提出来,变成一个 01 串 1110,第 \(1\) 位提出来,得到 0110……

2. 对每一位求贡献

二进制拆分后,问题也就转化成了:对每个 01 串求所有含有奇数个 \(1\) 的区间的区间长度和 \(res\)(因为只有含奇数个 \(1\) 的区间,异或和才为 \(1\),长度才会被计入贡献)。

下面用 dp 求 \(res\):

要研究区间,往往通过前缀来转化。有哪些情况能使得区间 \([l,r]\) 有奇数个 \(1\) 呢?

  • 如果区间 \([1,r]\) 有奇数个 \(1\),区间 \([1,l]\) 有偶数个 \(1\),则区间 \([l,r]\) 有奇数个 \(1\);
  • 如果区间 \([1,r]\) 有偶数个 \(1\),区间 \([1,l]\) 有奇数个 \(1\),则区间 \([l,r]\) 有奇数个 \(1\)。

由此,我们

  • 设 \(cnt_{i,0/1}\) 表示在 \([1,i]\) 中,有多少个前缀含有偶数/奇数个 \(1\);
  • 设 \(sum_{i,0/1}\) 表示在 \([1,i]\) 中,含有偶数/奇数个 \(1\) 的前缀总长度是多少;
  • 设 \(len_i\) 表示恰好以 \(i\) 结尾的含有奇数个 \(1\) 的区间的总长度,显然 \(res=\sum len_i\)。

于是有

\(len_i = cnt_{i-1,0}\times i-sum_{i-1,0}\),若 \([1,i]\) 有偶数个 \(1\);
\(len_i = cnt_{i-1,1}\times i-sum_{i-1,1}\),若 \([1,i]\) 有奇数个 \(1\)。

这实质上是把所有前缀和作差求区间和的操作放在一起做。

3. 合并每一位统计答案

最终的答案 \(ans=\sum\limits_{i=0}^{30} res_i\times 2^i\)。

下面是 AC 代码:

void solve() {
    int n, ans = 0;
    cin >> n;
    vector<int> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int t = 0; t <= 30; t++) {
        for (int i = 1; i <= n; i++) {
            b[i] = (a[i] >> t) & 1;
        }
        int x = 0, res = 0;   // the number of 1s
        int cnt[2] = {1, 0};  // the number of the intervals
        int sum[2] = {0, 0};  // the sum of the intervals' lengthes
        for (int i = 1; i <= n; i++) {
            x = (x + b[i]) % 2;
            res = (res + (LL)cnt[1 - x] * i % mod - sum[1 - x] + mod) % mod;
            cnt[x]++, sum[x] = (sum[x] + i) % mod;
        }
        ans = (ans + (LL)res * ((1 << t) % mod) % mod) % mod;
    }
    cout << ans << endl;
}

THE END

标签:CF1879D,XOR,奇数,int,res,Sum,异或,区间,sum
From: https://www.cnblogs.com/th19/p/17729834.html

相关文章

  • Xor
    [ABC098D]XorSum2常规做法:发现区间缩小后肯定还是满足要求,于是双指针即可。code1非常规做法:(我的做法)我们可以发现,如果没有任何一个\(0\),那么区间长度不超过\(20\)。如何克服\(0\)?我们每个位置向右维护第一个非零的位置,然后每次跳到非零位置累加,根据最远长度计算个数。......
  • mysql查询sum出来数据是decimal,转换成int
    mysql查询count数据是decimal,用python转换json格式的时候会报错,在查询的时候处理成无符号型,用cast查询出来countNum是DecimalSELECTgid,SUM(number)countNumFROM`gift_tb`WHEREtid="1"GROUPBYgid转换成无符号型SELECTgid,CAST(SUM(number)ASSIGNED)AScoun......
  • AT_abc321_f [ABC321F] #(subset sum = K) with Add and Erase 题解
    AT_abc321_f[ABC321F]#(subsetsum=K)withAddandErase题解题目大意现在有一个空箱子。给你两个数\(Q,K\),然后给你\(Q\)行,每一行代表一个操作:\(+x\),即向箱子里加一个权值为\(x\)的小球。\(-x\),即从箱子里把权值为\(x\)的小球拿一个出来。保证合法,即箱子......
  • P6667 [清华集训2016] 如何优雅地求和 -Binomial Sum
    题面有一个多项式函数\(f(x)\),最高次幂为\(x^m\),定义变换\(Q\):\[Q(f,n,x)=\sum_{k=0}^{n}f(k)\binom{n}{k}x^k(1-x)^{n-k}\]现在给定函数\(f\)和\(n,x\),求\(Q(f,n,x)\bmod998244353\)。出于某种原因,函数\(f\)由点值形式给出,即给定\(a_0,a_1,⋯,a_m\)共\(m+1\)个......
  • [AGC030D] Inversion Sum
    ProblemStatementYouaregivenanintegersequenceoflength$N$:$A_1,A_2,...,A_N$.Letusperform$Q$operationsinorder.The$i$-thoperationisdescribedbytwointegers$X_i$and$Y_i$.Inthisoperation,wewillchooseoneofthefollowingtwoacti......
  • 无涯教程-JavaScript - SUMIF函数
    描述您可以使用SUMIF函数对满足指定条件的范围内的值求和。语法SUMIF(range,criteria,[sum_range])争论Argument描述Required/Optionalrange您要通过条件判断的单元格范围。每个范围中的单元格必须是数字或包含数字的名称,数组或引用。空白和文本值将被忽略。......
  • Xor-Subsequence (字典树优化DP)
     思路;明显的是,后一个i要从前面一个进行更新, 利用dpeasy版本ai<=200,发现当n>=300时,对他是没有影响的,这样比较好记录ans进行更新,利用数据结构处理hard版本拆位,利用字典树dp,把参数变成相同的参数,a[i]和i,(比大小:前K位一样第K+1位不一样......
  • 无涯教程-JavaScript - SUM函数
    描述SUM函数可添加值。语法SUM(number1,[number2]...)争论Argument描述Required/Optionalnumber1Thefirstnumberyouwanttoadd.Thenumbercanbeavalue,acellreference,oracellrange.Requirednumber2,…Youcanspecifyupto255additionaln......
  • 计算机视觉算法中的视频摘要(Video Summarization)
    引言随着数字视频内容的爆炸式增长,如何高效地获取视频的关键信息成为了一个重要的问题。视频摘要(VideoSummarization)作为计算机视觉领域的一个重要研究方向,旨在通过自动化方法从长时间的视频中提取出关键的、代表性的内容,以便用户能够快速浏览和获取视频的核心信息。本文将介绍视......
  • Xor
    moectf{You_kn0w_h0w_t0_X0R!}XOR下载直接得到一个exe程序拖入die,64位,无壳拖入idaF5得到重点在enc数组,然后input字符串要跟其进行亦或操作,所以只要找到enc数组再将其跟0x39进行亦或便可以得到input数组(a^b=c==a^c=b)但是这里的伪代码没有enc的定义,只能在汇编代码里寻......