我的时间复杂度没问题啊,为什么超时
查看原帖
我的时间复杂度没问题啊,为什么超时
524191
Man_CCNU楼主2023/3/28 21:43
#include<iostream>
#include<cstring>

using namespace std;

const int N = 3e6 + 10, M = 30 + 10;

long long f[M],a[N],b[N], n, t,res,mod=998244353;

int main()
{
    scanf("%d", &t);
    b[0] = 1;
    for (int i = 1; i < N; i++) {
        b[i] = (b[i - 1] * 2) % mod;
    }
    for (int i = 1; i <= t; i++) {
        scanf("%d", &n);
        memset(f, 0, sizeof f);
        res = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        }
        for (int j = 1; j <=32; j++) {
            int k1 = 0, k2 = 0;
            for (int i = 1; i <= n; i++) {
                //f[j] = f[j];
                if (a[i] &( 1ll << (j - 1))) {
                    if (k1 + k2 >= 1) {
                        if (k2) {
                            f[j] = (f[j] + b[k1 + k2 - 1]) % mod;
                        }
                        else {
                            f[j] = (f[j] + b[k1]) % mod;
                        }
                    }
                    else {
                        f[j] = (f[j] + 1);
                    }
                    k2++;
                }
                else {
                    if (k2) {
                        f[j] = (f[j] + b[k1 + k2 - 1]) % mod;
                    }
                    k1++;
                }
            }
            res = (res + ((f[j]) * b[j - 1]) % mod) % mod;
        }
        printf("%d\n", res);
    }

    return 0;
}
2023/3/28 21:43
加载中...