CF1879D 求调qwq
  • 板块题目总版
  • 楼主朦胧_XY
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/25 01:16
  • 上次更新2023/11/2 18:13:05
查看原帖
CF1879D 求调qwq
358971
朦胧_XY楼主2023/9/25 01:16

CF1879D

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 300005, Mod = 998244353;
int T, n, a[35][N];
ll g[N], h[N], sumg[N], sumh[N], ans;
int main(){
    int x;
    scanf("%d", &n);
    for(int i = 1, j; i <= n; i++){
        scanf("%d", &x); j = 0;
        while(x) a[j][i] = x & 1, x >>= 1, j++;
    }
    for(int j = 0; j <= 30; j++){
        a[j][1] ? (h[1] = sumh[1] = 1) : (g[1] = sumg[1] = 1);
        ans = (ans + sumh[1]) % Mod;
        for(int i = 2; i <= n; i++){
            g[i] = (a[j][i] ? h[i-1] : g[i-1] + 1) % Mod;
            h[i] = (a[j][i] ? g[i-1] + 1 : h[i-1]) % Mod;
            sumg[i] = (a[j][i] ? sumh[i-1] + g[i] : sumg[i-1] + g[i]) % Mod;
            sumh[i] = (a[j][i] ? sumg[i-1] + h[i] : sumh[i-1] + h[i]) % Mod;
            ans = (ans + (1<<j) * sumh[i]) % Mod;
        }
        for(int i = 1; i <= n; i++)
            g[i] = h[i] = sumg[i] = sumh[i] = 0;
    }
    printf("%lld\n", ans);
    return 0;
}

g[i] 记录右端点是 i 的偶区间数;
h[i] 记录右端点是 i 的奇区间数;
sumg[i] 记录右端点是 i 的偶区间长度和;
sumh[i] 记录右端点是 i 的奇区间长度和。

第一个样例过了,后两个样例答案少了,求助 T ^ T。

2023/9/25 01:16
加载中...