TPOI T1 题解
Register_int · · 题解
考察你是否记得
由定义,
老套路把
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 10;
const int mod = 998244353;
inline void cadd(int &x, int y) { x += y, x < mod || (x -= mod); }
int T, n, m, a[MAXN], b[MAXN], p[MAXN], q[MAXN], sum, tot;
int main() {
for (scanf("%d", &T); T--; ) {
scanf("%d", &n), *a = b[n + 1] = -1, sum = 0, tot = 1;
for (int i = 1; i <= n; i++) p[i] = -1;
for (int i = 0; i < n; i++) q[i] = -1;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
for (int i = 1; i <= n; i++) if (a[i] != a[i - 1]) p[i] = a[i];
for (int i = 1; i <= n; i++) if (b[i] != b[i + 1]) p[i] = b[i];
for (int i = 1; i <= n; i++) if (~p[i]) q[p[i]] = i - 1;
for (int i = 0, l = *q, r = *q; i < n; i++) {
if (~q[i]) l = min(l, q[i]), r = max(r, q[i]);
else tot = (ll)tot * (r - l + 1 - i) % mod;
cadd(sum, (ll)(l + 1) * (n - r) % mod);
}
printf("%lld\n", (ll)sum * tot % mod);
}
}