首页 > 其他分享 >Educational Codeforces Round 155 D (CF1879_D)

Educational Codeforces Round 155 D (CF1879_D)

时间:2023-09-25 23:46:04浏览次数:46  
标签:Educational 155 maxbit int sum Codeforces long cnt ll

题目大意

给一个长度为 \(n\) 的数组,求 \(\Sigma_{i=1}^{n} \Sigma_{j=i}^{n} 区间异或和 \times (j-i+1)\)
其中 \(n\leq 3e5,~a[i]\leq 1e9\)

分析

首先注意到由 \(l\) 到 \(r\) 的区间异或和可以转化为 \(sum_{l-1}~XOR~sum_r\)
因此,对于每一个点 \(x\) ,无论它作为上述的 \(sum_{i-1}\) 还是 \(sum_j\) ,如果它的某个二进制位(假设为第 \(k\) 位)为 \(1\) 而另一个值(\(sum_{i-1}\) 或 \(sum_r\) ) 的这一位为 \(0\) ,那么点 \(i\) 的第 \(j\) 位会对整体答案产生 \((1<<j)\times 某个值\) 的贡献

现在考虑这个“某个值”应该怎么算:

  • 对于点 \(x\) 的第 \(k\) 位,这个值是所有第 \(k\) 位为 \(0\) 的点的距离之和

因此设 \(f_{i,j}\) 表示所有第 \(j\) 位为 \(0\) 的点与第 \(i\) 个点的距离之和,考虑从 \(f_{i-1,j}\) 到 \(f_{i,j}\) 的转移:

  • 对于 \(i-1\) 以前的点(包含):每个点的距离会增加 \(1\)
  • 对于 \(i\) 及以后得点:每个点的距离会减少 \(1\)

那么考虑用一个 \(cnt_{i,j}\) 记录 \(i\) 及以前有多少个点的第 \(j\) 位是 \(0\) (这个很好记录),再记录一下所有数中第 \(j\) 位为 \(0\) 的数有多少个(记为 \(sumbit_j\))

则 \(f_{i,j}=f_{i-1,j}+cnt_{i-1,j}-(sumbit_j-cnt{i-1,j})\)

计算完 \(f_{i,j}\) 后,如果第 \(i\) 个数的第 \(j\) 位是 \(1\),答案加上 \((1<<j)\times f_{i,j}\) 即可

Code:

#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
using ll = long long;
using ull = unsigned long long;
const ll mod = 998244353;
const int N = 3e5 + 5, M = 32;
ll f[N][M], cnt[N][M], a[N], sum[N], ans, sumbit[N];
int n, maxbit;

int main() {
    // freopen("d.txt", "r", stdin);
    IO;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        sum[i] = sum[i-1] ^ a[i];
        maxbit = max(maxbit, int(log2(sum[i])));
    }
    maxbit = 30;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= maxbit; j++) {
            if (i != 0) 
                cnt[i][j] = cnt[i-1][j];
            if (!(sum[i] & (1 << j))) {
                sumbit[j]++, cnt[i][j]++;
                f[0][j] = (f[0][j] + i) % mod;
            }   
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= maxbit; j++) {
            f[i][j] = ((f[i-1][j] + 2 * cnt[i-1][j]) % mod - sumbit[j] + mod) % mod;
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; (1 << j) <= sum[i]; j++) {
            if (sum[i] & (1 << j)) {
                ans += (1ll << j) * f[i][j];
                ans = (ans % mod + mod) % mod;
            }
        }
    }
    cout << ans;
    return 0;
}

标签:Educational,155,maxbit,int,sum,Codeforces,long,cnt,ll
From: https://www.cnblogs.com/tonyhgf/p/17729154.html

相关文章

  • Educational Codeforces Round 155 (Rated for Div. 2)
    EducationalCodeforcesRound155(RatedforDiv.2)A.Rigged!解题思路:若存在\(s[i]>=s[1]\)并且\(e[i]>=e[i]\),那么答案为\(-1\).否则,答案为\(s[1]\).代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constintN=1e6+10;con......
  • CF_EduRound155小丑寄
    一句话总结:A题理解错了,数据又水,所以寄了。过程:22:35开题。22:40怎么还没加载出来??急急急22:42哦,严格大于,但是主宾对调了,乐乐乐乐乐乐乐,cout<<ans;\(\rightarrow\)cout<<ans-1;22:45一发过。。。22:45-23:38啥事没有。23:38开E题23:50左右好像有点思路......
  • Codeforces463-E.Team Work-组合数、DP
    Codeforces463-E.TeamWork题意:求\[\sum_{i=1}^n\binom{n}{i}i^k\]其中\(1\leqn\leq10^9\),\(1\leqk\leq5000\)。题解:其实这个题\(k\)的数据范围就已经暗示了做法的复杂度——应该是要去考虑根据\(k\)去递推了。首先为了方便,\(i=0\)这一项完全可以补上,用类似生成函......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    比赛链接A.Rigged!题目链接就是一个比较简单的模拟就可以解决,如何判断能不能第一只需要考虑比他力量大的耐力是不是也比他大就行,而只要比他大,他就不可能第一,否则输出他的力量作为标杆就行,这样也可以避免比他力量小的也可以举起来。#include<bits/stdc++.h>usingnamespaces......
  • 她是 Codeforces 第四名,也是知名视频平台bilibili的“网红”
    在2023年9月24日~9月25日举办的EducationalCodeforcesRound155(RatedforDiv.2)上,以优秀成绩拿下第四名仅学了ACM一年的Nanani,成为最夺目的选手之一。而且虽然是仅学了一年的选手,但她取得优异成绩后,不少网友并不感到陌生,纷纷留言:这不是bilibili上天天直播爆切神仙题的妹子......
  • CodeForces 1062F Upgrading Cities
    洛谷传送门CF传送门考虑一个子问题:求从某个点\(u\)能到达的点数。如果要精确地计算出来,最优解法只能是\(O(\frac{n^2}{w})\)的bitset。但是我们还没有利用到题目的性质,我们只需要判断一个点是否至多有一个点互不可达。考虑拓扑排序的过程,队列里面的点两两互不可达。维护......
  • Codeforces 1868D. Flower-like Pseudotree
    题目链接:D-Flower-likePseudotree题目大意:给定度数数组\({d_n}\),要求构造一个\(n\)个点\(n\)条边的连通图(也就是基环树),允许有重边,但不能有自环。需要满足第\(i\)个点的度数恰好为\(d_i\),并且将环上的边全部删去后,剩下的每棵树的高度(以原先在环上的点为根)相同。首先考......
  • CodeForces 1149D Abandoning Roads
    洛谷传送门CF传送门考虑一条\(1\toi\)的路径是否在最小生成树上。称边权为\(a\)的边为轻边,边权为\(b\)的边为重边。轻边若不成环则一定在最小生成树上,因此先把轻边合并,这样形成了若干连通块。那么如果两点在一个连通块,它们只能通过轻边互达。同时,因为是树上路径,所......
  • Educational Codeforces Round 97 (Rated for Div 2) G. Death DBMS
    Problem-G-Codeforces题意给定n个字符串,每个字符串有一个值val,n次询问,每次给一个字符串,询问给定n个字符串中是询问字符串子串的值的最大值分析多模式匹配,从中找到给定串的子串,想到建立ac自动机,对于给定字符串,在自动机上面匹配时,沿fail指针向上跳并求最大值即可,由于n个字符......
  • Codeforces Round 898 (Div. 4)(A-H)
    CodeforcesRound898(Div.4)A.给abc的某个排列,问能否最多交换一次让排列变成abc直接看有几个不在原位就行查看代码#include<iostream>usingnamespacestd;voidsolve(){ chara,b,c; cin>>a>>b>>c; intans=0; if(a!='a')ans++; if(b!='b')ans++; ......