QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#55609#1823. Permutation CFGckiseki#WA 613ms104660kbC++6.5kb2022-10-14 19:58:362022-10-14 19:58:37

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-14 19:58:37]
  • 评测
  • 测评结果:WA
  • 用时:613ms
  • 内存:104660kb
  • [2022-10-14 19:58:36]
  • 提交

answer

#include <bits/stdc++.h>
#ifdef CKISEKI
#define safe cerr<<__PRETTY_FUNCTION__<<" line " <<__LINE__<<" safe\n"
#define debug(a...) qwerty(#a, a)
#define orange(a...) dvorak(#a, a)
using std::cerr;
template <typename ...T>
void qwerty(const char *s, T ...a) {
    cerr << "\e[1;32m(" << s << ") = (";
    int cnt = sizeof...(T);
    (..., (cerr << a << (--cnt ? ", " : ")\e[0m\n")));
}
template <typename Iter>
void dvorak(const char *s, Iter L, Iter R) {
    cerr << "\e[1;32m[ " << s << " ] = [ ";
    for (int f = 0; L != R; ++L)
        cerr << (f++ ? ", " : "") << *L;
    cerr << " ]\e[0m\n";
}
#else
#define safe ((void)0)
#define debug(...) ((void)0)
#define orange(...) ((void)0)
#endif

using namespace std;

const int maxn = 100025;

using Big = __int128;

struct Fenwick {
    int cnt[maxn];
    Big sum[maxn];
    void add(int p, int u, Big v) {
        for (++p; p < maxn; p += p & -p) {
            cnt[p] += u;
            sum[p] += v;
        }
    }
    pair<int,Big> query(int p) {
        int c = 0;
        Big s = 0;
        for (++p; p > 0; p -= p & -p)
            c += cnt[p], s += sum[p];
        return { c, s };
    }
    int bsearchSum(Big &k) {
        Big orgk = k;
        int p = 0;
        for (int s = 1 << 20; s; s >>= 1) {
            if (p + s < maxn && sum[p + s] < k) {
                p += s;
                k -= sum[p];
            }
        }
        if (query(p).second == orgk) {
            ++p;
            k = 0;
        }
        return p;
    }
    void init() {
        memset(cnt, 0, sizeof(cnt));
        memset(sum, 0, sizeof(sum));
    }
} BIT;

struct ar : array<Big,6> {
    ar & operator+=(const ar &rhs) {
        for (int j = 0; j < 6; j++)
            (*this)[j] += rhs[j];
        return *this;
    }
};


ar operator+(ar lhs, const ar &rhs) {
    for (int j = 0; j < 6; j++)
        lhs[j] += rhs[j];
    return lhs;
}

struct Segtree {
    ar st[maxn * 2];
    int n;
    void init(int _n) {
        n = _n;
        for (int i = 0; i < n * 2; i++)
            st[i] = ar{};
    }
    void add(int p, ar val) {
        for (st[p += n] += val; p > 1; p >>= 1)
            st[p >> 1] = st[p] + st[p ^ 1];
    }
    ar query(int l, int r) {
        ar res = {};
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l & 1) res += st[l++];
            if (r & 1) res += st[--r];
        }
        return res;
    }
} sgt;

// int C(int n, int k) {
//     int64_t p = 1;
//     for (int i = 0; i < k; i++)
//         p *= n - i;
//     for (int i = 1; i <= k; i++)
//         p /= i;
//     return p;
// }

ostream & operator<<(ostream &o, Big b) {
    static auto tos = [](Big x) -> string {
        assert (x >= 0);
        if (!x) return "0";
        string s;
        while (x)
            s += char(x % 10 + '0'), x /= 10;
        reverse(s.begin(), s.end());
        return s;
    };
    return o << tos(b);
};

int main() {
    // freopen("g.in", "r", stdin);
    // cerr << "reopen g.in" << endl;
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, s, q;
    cin >> n >> s >> q;

    vector<int> p(n+1), pos(n+1);
    vector<array<Big,6>> dp(n+1);

    for (int i = 1; i <= n; i++)
        dp[i][0] = 1;

    for (int j = 1; j <= s; j++) {
        dp[0][j] = 0;
        for (int i = 1; i <= n; i++) {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }

    // for (int j = 0; j <= s; j++) {
    //     for (int i = 0; i <= n; i++) {
    //         cout << dp[i][j] << ' ';
    //     }
    //     cout << endl;
    // }

    // for (int i = 1; i <= n; i++) p[i] = i;
    for (int i = 1; i <= n; i++) cin >> p[i];
    for (int i = 1; i <= n; i++)
        pos[p[i]] = i;

    vector<int> ql(q);
    vector<vector<pair<Big,int>>> Q1(n+1), nQ1;
    for (int i = 0; i < q; i++) {
        int a;
        cin >> ql[i] >> a;
        Q1[n].emplace_back(a, i);
    }

    vector<vector<tuple<int,int,int>>> qs[7];
    for (int j = 0; j <= s; j++)
        qs[j].resize(n + 2);

    for (int j = s - 1; j >= 0; j--) {
        nQ1.assign(n+1, {});
        BIT.init();
        debug(j);
        for (int i = 1; i <= n; i++) {
            BIT.add(pos[i], 1, dp[i][j]);
            // for (int k = 1; k <= n; k++)
            //     cerr << BIT.query(k).second-BIT.query(k-1).second << ' ';
            // cerr << endl;

            for (auto [a, qid]: Q1[i]) {
                debug(a, qid, BIT.query(n).second);
                int pp = BIT.bsearchSum(a); // `a` changes
                // assert (ql[qid] <= i); // FIXME
                qs[j][pp].emplace_back(ql[qid], i, qid);
                if (a == 0) continue;
                int nxt = p[pp];
                nQ1[nxt].emplace_back(a, qid);
                debug(a, qid, pp, nxt);
            }
        }
        Q1 = nQ1;
    }

    vector<Big> ans(q);

    const auto calc = [](ar powsum, int a, int b) {
        // C(x - a + b, b)
        vector<Big> poly{1};
        for (int j = 0; j < b; j++) {
            // poly *= (x - a + b - j)
            vector<Big> newpoly(poly.size() + 1);
            for (int k = 0; k < poly.size(); k++) {
                newpoly[k + 1] += poly[k];
                newpoly[k] += (-a + b - j) * poly[k];
            }
            poly = newpoly;
        }

        Big res = 0;
        for (int j = 0; j < poly.size(); j++)
            res += poly[j] * powsum[j];
        Big div = 1;
        for (int i = 1; i <= b; ++i)
            div *= i;
        res /= div;
        return res;
    };

    for (int j = s; j >= 0; j--) {
        vector<int> freq(n + 1);
        sgt.init(n + 1);
        for (int i = 1; i <= n + 1; i++) {
            for (auto [l, r, qid]: qs[j][i]) {
                /*
                // debug(l, r, i, j);
                for (int x = 1; x < i; x++) {
                // cerr << "p[x] = " << p[x] << endl;
                if (l <= p[x] && p[x] <= r) {
                if (j == 0)
                ans[qid] += p[x] == l;
                else
                ans[qid] += C(p[x] - l + j - 1, j - 1);
                }
                }
                // debug(ans[qid]);
                 */

                if (j == 0) {
                    ans[qid] += freq[l];
                } else {
                    auto powsum = sgt.query(l, r + 1);
                    ans[qid] += calc(powsum, l, j - 1);
                }
            }
            if (i <= n) {
                freq[p[i]] += 1;
                ar tmp;
                tmp[0] = 1;
                for (int k = 1; k <= s; k++)
                    tmp[k] = tmp[k - 1] * p[i];
                sgt.add(p[i], tmp);
            }
        }
    }

    for (int i = 0; i < q; i++)
        cout << ans[i] << '\n';

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 5696kb

input:

4 3 6
1
4
3
2
1 6
2 20
4 1
3 5
2 9
1 16

output:

3
6
0
1
2
8

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 584ms
memory: 104156kb

input:

100000 5 200000
98129
52962
60307
83804
75634
55811
85666
40965
78529
40850
54600
83058
37001
92436
30323
54632
24238
77437
87162
75991
39863
74990
32168
99841
85430
66056
69893
7561
60704
40795
81535
89902
44331
20995
99461
93620
91817
97370
84025
98836
2455
77447
37078
90192
26249
84337
70311
4006...

output:

20217
9885
20204
20217
20218
20217
20217
727
20202
20218
20218
20214
20217
7790
20217
20217
20200
20217
20218
20217
20218
20218
20218
20217
20202
20217
20218
20218
5609
8419
20218
20200
20218
20216
11843
20218
20217
20207
20217
935
20203
5909
20218
20217
20218
20200
20217
20213
20203
20207
5654
4087...

result:

ok 200000 numbers

Test #3:

score: 0
Accepted
time: 558ms
memory: 104660kb

input:

100000 5 200000
59767
75967
97372
50276
20532
77164
30969
40418
84175
87555
79967
28404
26422
22441
4543
72719
9318
93986
12744
88814
25854
93658
9042
41389
24133
60155
80340
44920
58271
50431
92622
28573
30633
318
43850
78809
69750
67699
17767
8454
2543
26572
52552
77502
24901
94119
87156
19368
394...

output:

33305
33330
19455
33332
25500
1777
33332
33310
33337
33333
33297
33331
33337
33330
33317
33304
33332
33336
33331
33337
33335
5611
33334
33337
33333
33331
33337
33307
33334
22446
31995
27049
33337
5351
32269
33332
33334
33331
33299
33331
33334
24072
21451
33331
33338
33332
33331
33331
33319
23356
333...

result:

ok 200000 numbers

Test #4:

score: 0
Accepted
time: 528ms
memory: 103428kb

input:

97997 5 200000
92883
53079
12146
7142
47500
47118
60176
54625
8908
93576
33824
61522
79201
68956
25790
76970
63243
10575
33345
20943
77076
40068
30980
20739
90036
57454
38446
49088
90613
27293
39453
52577
94545
7934
73793
6201
33713
91255
45678
63783
65019
35224
65407
39863
38120
79943
69106
76540
6...

output:

21513
21504
21512
21513
21512
19613
21418
21511
21512
6191
21512
18462
4097
21511
21511
21510
21499
21502
21513
21512
21499
21512
21512
21513
21512
21512
21501
21512
10071
21513
21510
21511
21513
21512
21511
21498
21512
21511
21497
21513
21512
21512
21513
21512
21491
21513
16589
21508
21511
21500
20...

result:

ok 200000 numbers

Test #5:

score: 0
Accepted
time: 428ms
memory: 98840kb

input:

97997 5 200000
1
2
3
4
5
6
7
8
9
10
97997
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
...

output:

36269
44641
44708
44743
44700
45423
39594
44743
44405
44918
43915
44740
44706
28640
44655
44062
45423
22483
18051
44678
44757
44686
44695
44645
44830
44723
44700
35460
37180
43835
18485
40508
33475
45038
44723
44665
41482
44778
44633
44714
41636
45203
43011
42876
40377
41790
45709
43725
44184
38340
...

result:

ok 200000 numbers

Test #6:

score: 0
Accepted
time: 419ms
memory: 98220kb

input:

100000 4 200000
57295
10377
65950
19742
78625
70832
98216
11307
9435
8964
76095
1478
46489
61182
52528
10230
50341
83069
94103
42263
18143
52203
16940
68520
76816
98586
96583
28873
59764
20859
85162
22208
33614
52858
48657
87020
40526
40052
31847
30496
89165
52856
35045
71923
20595
57732
33398
21247...

output:

34970
34961
34984
34987
34983
34964
34976
34929
34980
34960
34952
34931
34985
34974
34942
34917
34983
34971
34989
34956
34976
34961
34934
34985
34942
34965
34989
34986
34975
34985
34932
34980
34987
34987
34981
34984
34987
34985
34963
34989
34953
34958
34975
34964
34927
34980
34969
34985
34944
34966
...

result:

ok 200000 numbers

Test #7:

score: -100
Wrong Answer
time: 613ms
memory: 104660kb

input:

100000 5 200000
65145
22925
57683
48950
47
95014
89971
86419
68041
34514
54368
9070
62968
12058
2395
12953
52181
44707
15141
42970
42586
24500
7627
11589
2549
58411
97779
75300
26698
28015
65395
73656
93413
6314
67115
29279
47001
60377
25606
34502
91013
49546
42758
59346
59698
46487
44285
25907
1322...

output:

10900
1
22894
30657
9289
30701
30702
30701
30695
30695
30392
439
30491
30304
30696
30481
30355
30701
4108
0
30648
24531
0
6293
4639
8441
8856
30702
23474
30417
30634
8671
30702
30703
30703
30287
18522
8635
21217
0
30690
1205
30700
30684
13422
30680
5336
30459
6987
18437
3330
30686
20754
30702
30291
...

result:

wrong answer 2nd numbers differ - expected: '0', found: '1'