P17693 题解
_constexpr_int_ · · 题解
一开始想的是维护
注意到可以满足
先考虑优化前缀最大值变的情况,本来的式子是
再考虑优化前缀最大值不变的情况,维护一个
constexpr int Maxn = 5e3 + 5;
constexpr int Mod = 998244353;
inline void Add(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
int x[Maxn], y[Maxn];
int f[2][Maxn], diff[Maxn], pre[Maxn];
vector <int> tg[Maxn];
void Main() {
int n; cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i];
tg[x[i]].push_back(i);
}
for (int i = 1; i <= n; i++) {
cin >> y[i];
diff[max(i, y[i])]++;
}
f[0][0] = 1;
for (int i = 0; i < n; i++) {
int u = i & 1;
memset(f[u ^ 1], 0, sizeof f[u ^ 1]);
for (int v : tg[i + 1]) {
diff[max(v, y[v])]--;
diff[v]++;
}
pre[0] = f[u][0]; int cnt = 0;
for (int j = 1; j <= n; j++) {
cnt += diff[j];
Add(f[u ^ 1][j], 1ll * (cnt - i) * f[u][j] % Mod);
pre[j] = (pre[j - 1] + f[u][j]) % Mod;
}
for (int v = 1; v <= n; v++) {
if (y[v] > v - 1 && i + 1 < x[v]) continue;
Add(f[u ^ 1][v], i + 1 >= x[v] ? pre[v - 1] : (pre[v - 1] - pre[y[v] - 1] + Mod) % Mod);
}
}
cout << f[n & 1][n] << '\n';
for (int i = 0; i < 2; i++)
for (int j = 0; j <= n; j++) f[i][j] = 0;
for (int i = 1; i <= n; i++) tg[i].clear();
for (int i = 0; i <= n; i++) {
pre[i] = diff[i] = 0;
}
}