WA*13求调
查看原帖
WA*13求调
470769
DengStar楼主2024/11/18 10:27

RT,调了一年,交了十发都不对,实在不知道哪里错了,求大佬帮忙看一下/kk
提交记录

// G - Another Shuffle Window
#include<bits/stdc++.h>
#define debug(...) fprintf(stderr, __VA_ARGS__)

using namespace std;

typedef long long i64;

constexpr i64 MOD = 998'244'353;

int N, K;
vector<int> p;
vector<i64> f; // f[i]: [i, i + K - 1] 中的逆序对数量

struct BIT
{
    vector<int> c;
    BIT(): c(N + 1, 0) {}
    template<typename T> T lowbit(T x) {return x & -x;}
    int query(int pos)
    {
        int ret = 0;
        while(pos)
            ret += c[pos], pos -= lowbit(pos);
        return ret;
    }
    int query(int L, int R)
    {
        if(L > R)
            return 0;
        return query(R) - query(L - 1);
    }
    void change(int pos, int x)
    {
        while(pos <= N)
        {
            c[pos] += x;
            pos += lowbit(pos);
        }
    }
    void clear() { fill(c.begin(), c.end(), 0); }
};

i64 inv(i64 x)
{
    i64 k = MOD - 2, ret = 1ll, base = x;
    while(k)
    {
        if(k & 1)
            ret = ret * base % MOD;
        base = base * base % MOD;
        k >>= 1;
    }
    return ret;
}

int main()
{
    cin >> N >> K;
    p.resize(N), f.resize(N);
    for(int &x: p)
        cin >> x;

    // 计算 f[0..N-K]
    BIT tr;
    i64 now = 0ll;
    for(int i = 0; i < K; i++)
    {
        int cnt = tr.query(p[i] + 1, N);
        now = (now + cnt) % MOD;
        tr.change(p[i], 1);
    }
    f[0] = now;
    for(int i = 1; i + K - 1 < N; i++)
    {
        int cnt = tr.query(1, p[i - 1] - 1);
        now = (now - cnt + MOD) % MOD, tr.change(p[i - 1], -1);
        int cnt2 = tr.query(p[i + K - 1] + 1, N);
        now = (now + cnt2) % MOD, tr.change(p[i + K - 1], 1);
        f[i] = now;
    }

    // 计算全局逆序对数量 S
    tr.clear();
    i64 S = 0ll;
    for(int i = 0; i < N; i++)
    {
        S = (S + tr.query(p[i] + 1, N)) % MOD;
        tr.change(p[i], 1);
    }

    // 统计答案 ans
    i64 sum = 0ll, C = K * (K - 1) % MOD * inv(4) % MOD;
    for(int i = 0; i + K - 1 < N; i++)
    {
        i64 tmp = ((S - f[i]) % MOD + C) % MOD;
        sum = (sum + tmp) % MOD;
    }

    i64 ans = sum * inv(N - K + 1) % MOD;
    ans = (ans % MOD + MOD) % MOD;
    cout << ans << endl;

    return 0;
}
2024/11/18 10:27
加载中...