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

CF1879D Sum of XOR Functions

时间:2024-02-17 20:11:54浏览次数:31  
标签:cnt CF1879D XOR int Sum times oplus 贡献 sum

记前缀异或和数组 \(s\),于是题目中的 \(f(l,r)\) 可以被表示成 \(s_r \oplus s_{l-1}\),转化为求 \(\sum\limits_{l=1}^n \sum \limits_{r=l}^n (s_r \oplus s_{l-1})\times (r-l+1)\)。

再记录 \(4\) 个值,\(cnt_0,cnt_1,sum_0,sum_1\) 分别表示当前已经出现过的 \(0/1\) 的个数,出现的所有 \(0/1\) 的下标和。

从左到右遍历 \(s\) 数组,对于当前遍历到的 \(s_i\),进行拆位计算贡献。

设 \(s_i\) 的第 \(j\) 位为 \(x\),那么有 \(cnt_{!x}\) 个数产生贡献,所以原式 \((s_r \oplus s_{l-1})\times (r-l+1)\) 中 \(r\) 的贡献为 \(cnt_{!x} \times i\),前面的 \(l-1\) 的贡献即为维护的下标和 \(sum_{!x}\)。

参考了 jiangly 的做法,感觉非常优美。

const int N = 3e5 + 5, P = 998244353;
int n, s[N], cnt[2], sum[2];
signed main()
{
    cin >> n;
    R(i, 1, n)
    {
        int x;
        cin >> x;
        s[i] = s[i - 1] ^ x;
    }
    int ans = 0;
    R(j, 0, 31)
    {
        cnt[0] = cnt[1] = sum[0] = sum[1] = 0;
        R(i, 0, n)
        {
            int x = s[i] >> j & 1;
            (ans += ((1ll * i * cnt[!x] % P - sum[!x]) * (1 << j) % P + P) % P) %= P;
            ++cnt[x];
            (sum[x] += i) %= P;
        }
    }
    cout << ans << '\n';
    return 0;
}

标签:cnt,CF1879D,XOR,int,Sum,times,oplus,贡献,sum
From: https://www.cnblogs.com/cyyhcyyh/p/18018303

相关文章

  • bug-missing GOSUMDB
     问题描述:D:\gopj>gomodtidygo:findingmoduleforpackagego.uber.org/zapgo:findingmoduleforpackagegithub.com/valyala/fasthttpgo:downloadinggo.uber.org/zapv1.26.0go:downloadinggithub.com/valyala/fasthttpv1.52.0go:githun.com/bigwh......
  • 「题解」ARC139F Many Xor Optimization Problems
    考虑线性空间的标准基底(即每个主元都只有对应向量有值),答案为所有基底异或和。对于一个秩\(k\)计算它对答案的贡献。固定主元为\(a_1<a_2<\cdots<a_k\),各种情况应该是等概率,也就是对第\(i\)个基底来说,\(a_i\)位一定为\(1\),再往下的位除了在\(a\)出现过的以外的位0/1是......
  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
    目录题面链接题意题解代码总结题面链接C.LittleGirlandMaximumSum题意给q个[l,r]将所有这些区间里面的数相加和最大。可以进行的操作是任意排列数组题解对出现的每个区间内的位置加上1,代表权值操作完之后求一遍前缀和,得到每个位置的权值然后贪心的考虑,权值越大,应......
  • POJ--3764 The xor-longest Path(Trie)
    记录13:562024-2-10找到俩个点,获得最大的边权异或值。利用异或的性质,一个值被异或俩次相当于没有异或即axorbxorb=a所以先从顶点出发,获得每个点路径上的异或值,然后对这俩个值进行异或就获得了他们之间路径的异或值。获取从顶点到每个点路径上的异或值后,可以利用trie来......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......
  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • CF1446C Xor Tree 题解
    解题思路与其考虑删除哪些点,不如考虑保留哪些点。考虑到和异或有关,那么我们可以把这些数倒序插入trie树中,然后我们就可以在trie树上跑一个简单的dp:若当前节点为叶子节点,那么保留,返回\(1\);若当前节点在链上,那么直接继承儿子节点;若当前节点有两个儿子,那么更新为较大儿子......
  • Tokitsukaze and Min-Max XOR
    TokitsukazeandMin-MaxXOR题目描述Tokitsukaze有一个长度为$n$的序列$a_1,a_2,\ldots,a_n$​和一个整数$k$。她想知道有多少种序列$b_1,b_2,\ldots,b_m$​,满足:$1\leqb_i\leqn$$b_{i−1}<b_i​$$(2\leqi\leqm)$$\min⁡(a_{b_1}\,,a_{b_2}\,,\ldots......
  • 回溯法summary
    组合问题:从给定的一组元素中找出所有可能的组合,例如子集、组合总和等问题。排列问题:对一组元素进行排列,找出所有可能的排列方式,例如全排列问题。子集问题:找出给定集合的所有子集,包括空集和本身。棋盘类问题:如八皇后问题、数独问题,需要在一个棋盘上放置元素并满足一......
  • G - Smaller Sum
    G-SmallerSumProblemStatementYouaregivenasequence$A=(A_1,A_2,\dots,A_N)$oflength$N$.Answerthefollowing$Q$queries.The$i$-thqueryisasfollows:Findthesumoftheelementsamong$A_{L_i},A_{L_i+1},\dots,A_{R_i}$thatarenotgreate......