QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#725151#7904. Rainbow SubarrayaYi_7#TL 0ms3620kbC++174.1kb2024-11-08 16:28:192024-11-08 16:28:20

Judging History

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

  • [2024-11-08 16:28:20]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3620kb
  • [2024-11-08 16:28:19]
  • 提交

answer

#include <bits/stdc++.h>

#define int long long

bool check(std::vector<int>& a, int& k, int mid) {
    int n = a.size();

    // std::multiset<int> A, B;
    std::map<int, int> A, B;
    int sumA{}, sumB{};
    int cntA{}, cntB{};

    for (int i = 0; i < mid; i++) {
        // A.insert(a[i]);
        A[a[i]]++;
        cntA++;
        sumA += a[i];
    }

    while (A.size() > B.size()) {
        // int it = *A.rbegin();
        int it = A.rbegin()->first;
        // B.insert(it);
        B[it]++;
        cntB++;
        // A.erase(A.find(it));
        A[it]--;
        cntA--;
        if(A[it] == 0) {
            A.erase(it);
        }
        sumA -= it;
        sumB += it;
    }

    // int mi = *B.begin();
    // int res = mi * A.size() - sumA + sumB - mi * B.size();

    int mi = B.begin()->first;
    int res = mi * cntA - sumA + sumB - mi * cntB;

    for (int i = 0, j = mid; j < n; i++, j++) {
        // if (a[i] < *B.begin()) {
        //     A.erase(A.find(a[i]));
        //     sumA -= a[i];
        // } else {
        //     B.erase(B.find(a[i]));
        //     sumB -= a[i];
        // }
        if(a[i] < B.begin()->first) {
            A[a[i]]--;
            sumA -= a[i];
            cntA--;
            if(A[a[i]] == 0) {
                A.erase(a[i]);
            }
        }else {
            B[a[i]]--;
            sumB -= a[i];
            cntB--;
            if(B[a[i]] == 0) {
                B.erase(a[i]);
            }
        }
        // A.insert(a[j]);
        A[a[j]]++;
        sumA += a[j];
        cntA++;
        // while (A.size() > B.size()) {
        //     int it = *A.rbegin();
        //     B.insert(it);
        //     A.erase(A.find(it));
        //     sumA -= it;
        //     sumB += it;
        // }
        while(cntA > cntB) {
            int it = A.begin()->first;
            B[it]++;
            cntB++;
            A[it]--;
            cntA--;
            if(A[it] == 0) {
                A.erase(it);
            }
            sumA -= it;
            sumB += it;
        }
        // while(*A.rbegin() > *B.begin()) {
        //     int it1 = *A.rbegin();
        //     int it2 = *B.begin();
        //     A.erase(A.find(it1));
        //     B.erase(B.find(it2));
        //     sumA -= it1;
        //     sumB -= it2;
        //     A.insert(it2);
        //     B.insert(it1);
        //     sumA += it2;
        //     sumB += it1;
        // }
        while(A.rbegin()->first > B.begin()->first) {
            int it1 = A.rbegin()->first;
            int it2 = B.begin()->first;
            A[it1]--;
            if(A[it1] == 0) {
                A.erase(it1);
            }
            B[it2]--;
            if(B[it2] == 0) {
                B.erase(it2);
            }
            sumA -= it1;
            sumB -= it2;
            A[it2]++;
            B[it1]++;
            sumA += it2;
            sumB += it1;
        }

        // mi = *B.begin();
        // res = std::min(res, mi * (int)A.size() - sumA + sumB - mi * (int)B.size());
        mi = B.begin()->first;
        res = std::min(res, mi * cntA - sumA + sumB - mi * cntB);
    }
    return res <= k;
}

void solve() {
    int n, k;
    std::cin >> n >> k;
    std::vector<int> a(n);
    for(int i = 0; i < n; i++) {
        std::cin >> a[i];
        a[i] -= i;
    }

    // if(n == 1) {
    //     std::cout << 1 << '\n';
    //     return ;
    // }
    // else if(!check(a, k, 2)) {
    //     std::cout << 1 << '\n';
    //     return ;
    // }

    int l = 1, r = n;
    while (l < r) {
        int mid = l + r + 1 >> 1;
        // int mid = 1;
        if (check(a, k, mid))
            l = mid;
        else
            r = mid - 1;
    }
    std::cout << l << '\n';
}

/*
5
7 5
7 2 5 5 4 11 7
6 0
100 3 4 5 99 100
5 6
1 1 1 1 1
5 50
100 200 300 400 500
1 100
3

*/

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t = 1;
    std::cin >> t;

    for (int i = 0; i < t; ++i) {
        solve();
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

5
7 5
7 2 5 5 4 11 7
6 0
100 3 4 5 99 100
5 6
1 1 1 1 1
5 50
100 200 300 400 500
1 100
3

output:

4
3
5
1
1

result:

ok 5 lines

Test #2:

score: -100
Time Limit Exceeded

input:

11102
2 167959139
336470888 134074578
5 642802746
273386884 79721198 396628655 3722503 471207868
6 202647942
268792718 46761498 443917727 16843338 125908043 191952768
2 717268783
150414369 193319712
6 519096230
356168102 262263554 174936674 407246545 274667941 279198849
9 527268921
421436316 3613460...

output:

1
4
3
2
6
5
7
2
4
1
4
1
1
3
2
2
7
8
7
7
1
7
6
2
4
3
1
6
7
7
3
4
3
9
3
8
6
6
3
1
6
3
1
2
4
6
4
6
4
1
4
7
1
6
3
5
6
6
1
7
5
3
1
6
4
5
3
2
2
6
2
3
10
1
4
3
2
4
5
1
7
5
5
5
8
5
3
6
3
5
5
8
5
4
5
2
1
5
2
3
3
4
8
1
3
1
2
2
8
3
1
6
8
1
8
4
5
6
6
8
4
8
3
2
8
4
5
6
2
6
2
4
1
5
4
5
3
2
4
1
2
1
4
5
8
3
7
3
3
3...

result: