QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#736461#9631. Median ReplacementUESTC_NLNSWA 5ms3824kbC++204.1kb2024-11-12 11:13:102024-11-12 11:13:10

Judging History

你现在查看的是最新测评结果

  • [2024-11-12 11:13:10]
  • 评测
  • 测评结果:WA
  • 用时:5ms
  • 内存:3824kb
  • [2024-11-12 11:13:10]
  • 提交

answer

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
using pii = pair<int, int>;
const int mod = 998244353;
// [cur][max_ave][-2][-1]
using ll = long long;
int dp[2][2][2][2];
void add(int& x, int y) {
    x = x + y >= mod ? x + y - mod : x + y;
}
void sub(int& x, int y) {
    x = x >= y ? x - y : x + mod - y;
}

int qpow(int x, int t) {
    int res = 1;
    for (; t; t >>= 1, x = 1ll * x * x % mod)
        if (t & 1) res = 1ll * res * x % mod;
    return res;
}

int Lagrange(const vector<int>& x, const vector<int>& y, int n, int X) {
    int res = 0;
    for (int i = 0; i <= n; i++) {
        int s1 = 1, s2 = 1;
        for (int j = 0; j <= n; j++)
            if (i ^ j) {
                s1 = 1ll * s1 * (X - x[j]) % mod;
                s2 = 1ll * s2 * (x[i] - x[j]) % mod;
            }
        res = (res + 1ll * (1ll * s1 * qpow(s2, mod - 2) % mod) * y[i]) % mod;
    }
    return (res % mod + mod) % mod;
}

void solve() {
    int n;
    cin >> n;
    vector<int> v(2 * n);
    vector<int> l(n);
    vector<int> r(n);
    for (int i = 0; i < n; ++i) cin >> l[i], v[i] = l[i];
    for (int i = 0; i < n; ++i) cin >> r[i], v[i + n] = r[i] + 1;

    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    // auto rk = [&](int a) -> int {
    //     return lower_bound(v.begin(), v.end(), a) - v.begin();
    // };
    // 中位数大于等于a的有多少种情况
    auto query = [&](int a) -> int {
        int cur = 0;
        dp[cur][1][0][0] = 0;
        // t1 有几个数比a小
        int t1 = l[0] >= a ? 0 : (r[0] < a ? r[0] - l[0] + 1 : a - l[0]);
        int t2 = l[1] >= a ? 0 : (r[1] < a ? r[1] - l[1] + 1 : a - l[1]);
        int t3 = r[0] - l[0] + 1 - t1;
        int t4 = r[1] - l[1] + 1 - t2;
        dp[cur][0][0][0] = 1ll * t1 * t2 % mod;
        dp[cur][0][1][0] = 1ll * t3 * t2 % mod;
        dp[cur][0][0][1] = 1ll * t1 * t4 % mod;
        dp[cur][0][1][1] = 1ll * t3 * t4 % mod;

        for (int i = 2; i < n; ++i) {
            int t1 = l[i] >= a ? 0 : (r[i] < a ? r[i] - l[i] + 1 : a - l[i]);
            int t3 = r[i] - l[i] + 1 - t1;
            dp[cur ^ 1][1][0][0] = 1ll * dp[cur][1][0][0] * (t1 + t3) % mod;
            for (int i = 0; i < 2; ++i)
                for (int j = 0; j < 2; ++j) dp[cur ^ 1][0][i][j] = 0;

            for (int a1 = 0; a1 < 2; ++a1) {
                for (int a2 = 0; a2 < 2; ++a2) {
                    for (int a3 = 0; a3 < 2; ++a3) {
                        int num = a3 == 0 ? t1 : t3;
                        if (a1 + a2 + a3 >= 2)
                            add(dp[cur ^ 1][1][0][0], 1ll * dp[cur][0][a1][a2] * num % mod);
                        else {
                            add(dp[cur ^ 1][0][a2][a3], 1ll * dp[cur][0][a1][a2] * num % mod);
                        }
                    }
                }
            }
            cur ^= 1;
        };
        return dp[cur][1][0][0];
    };

    ll ans = 0;
    vector<int> X(160);
    for (int i = 0; i < 160; ++i) X[i] = i;

    for (int i = 1; i < v.size(); ++i) {
        int l = v[i - 1], r = v[i] - 1;
        vector<int> tmp(160);
        vector<int> tmp2(160);
        if (r - l <= 157) {
            for (int i = l; i <= r + 1; ++i) {
                tmp[i - l] = query(i);
            }
            for (int i = 0; i <= r - l; ++i) {
                sub(tmp[i], tmp[i + 1]);
                ans += 1ll * tmp[i] * (i + l) % mod;
            }
            continue;
        } else {
            for (int i = 0; i <= 155; ++i) {
                tmp[i] = query(i + l);
            }
            for (int i = 0; i < 155; ++i) {
                sub(tmp[i], tmp[i + 1]);
                tmp2[i] = ((i ? tmp2[i - 1] : 0) + 1ll * tmp[i] * (i + l)) % mod;
            }
            ans += Lagrange(X, tmp2, 154, r - l);
        }
    }
    cout << ans << '\n';
}

int main() {
    cin.tie(0), cout.tie(0), ios::sync_with_stdio(0);
    int t;
    cin >> t;
    while (t--) solve();
}
/*
5
3
1 1 1
1 1 1
3
1 1 1
1 2 2
4
1 100 6 400
1 300 6 800
3
1 1 1
2 2 2
5
1 3 7 4 2
1 9 8 4 3

1
5
16120200
12
164

*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3824kb

input:

10
5
5 1 4 3 2
14 2 5 3 2
5
4 5 1 2 3
13 7 1 2 3
5
5 2 5 3 1
10 2 12 3 2
5
5 5 3 1 5
57 5 3 1 5
5
2 2 3 3 5
4 5 4 4 5
5
4 5 3 5 3
13 7 3 5 3
5
5 1 4 2 3
14 3 4 2 3
5
1 2 5 4 5
2 8 5 7 5
5
1 1 3 5 1
8 2 3 8 1
5
4 4 4 2 3
5 10 5 2 3

output:

180
170
650
265
182
173
120
296
192
131

result:

ok 10 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 3608kb

input:

10
5
1 2 2 5 3
6 4 2 6 3
5
4 4 1 4 3
6 7 2 5 3
5
5 3 4 2 4
5 7 5 2 6
5
1 5 3 5 2
7 7 3 5 2
5
1 3 3 2 2
10 5 3 2 2
5
4 4 4 5 3
4 11 9 5 3
5
5 3 2 1 3
13 5 2 1 5
5
5 4 1 2 5
10 6 1 2 5
5
3 5 3 4 2
5 9 3 5 2
5
1 1 3 2 1
7 3 3 3 1

output:

120
230
144
110
110
289
324
89
140
122

result:

ok 10 lines

Test #3:

score: 0
Accepted
time: 0ms
memory: 3664kb

input:

10
5
3 1 3 4 4
9 1 3 10 4
5
1 1 3 1 1
9 1 3 3 1
5
5 1 2 3 1
74 1 2 3 1
5
2 5 5 3 4
5 6 8 3 4
5
2 1 3 4 5
2 4 6 4 5
5
2 4 2 1 3
2 11 3 2 3
5
1 5 4 4 2
1 14 6 6 2
5
4 1 3 5 1
9 2 4 5 1
5
4 1 2 4 4
6 1 6 4 4
5
3 2 5 3 5
8 8 5 3 5

output:

196
76
140
172
72
80
486
84
65
224

result:

ok 10 lines

Test #4:

score: -100
Wrong Answer
time: 5ms
memory: 3512kb

input:

10
5
676437428 903889545 700650370 965758082 146716866
676437431 903889567 700650370 965758082 146716866
5
517457740 64600397 388618400 783268973 388618400
517457797 64600397 388618400 783268973 388618400
5
971452763 106948541 259878781 537741075 9504353
971452780 106948544 259878781 537741075 95043...

output:

14278978795
578491434
742873878
206396969
2640152931
2025592479
586414917
8013037606
1457815775
613252895

result:

wrong answer 1st lines differ - expected: '157838571', found: '14278978795'