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;
}