QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#659958#7904. Rainbow SubarrayfosovWA 183ms5992kbC++142.3kb2024-10-20 00:11:112024-10-20 00:11:12

Judging History

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

  • [2024-10-20 00:11:12]
  • 评测
  • 测评结果:WA
  • 用时:183ms
  • 内存:5992kb
  • [2024-10-20 00:11:11]
  • 提交

answer

#include "bits/stdc++.h"
using namespace std;

#define ll long long
#define MOD ((int) (1e9) + 7)
#define pii pair<int, int>

#define N 500010

struct Median {
    multiset<int> l, r;
    ll lsum, rsum;

    void init() {
        l.clear(), r.clear();
        lsum = rsum = 0;
    }

    int size() {
        return l.size() + r.size();
    }

    void balance() {
        while (l.size() > (size() + 1) / 2) {
            int el = *l.rbegin();
            lsum -= el, rsum += el;
            l.erase(l.find(el)), r.insert(el);
        }
        while (r.size() > size() / 2) {
            int el  = *r.begin();
            lsum += el, rsum -= el;
            r.erase(r.find(el)), l.insert(el);
        }
    }

    ll cost() {
        if (size() == 0) return 0;
        return 1ll * l.size() * get() - lsum + rsum - 1ll * r.size() * get();
    }

    int get() {
        return *l.rbegin();
    }

    void add(int x) {
        if (size() == 0) {
            l.insert(x); 
            lsum += x;
            return;
        }

        if (x <= get()) {
            l.insert(x);
            lsum += x;
        } else {
            r.insert(x);
            rsum += x;
        }
        balance();
    }

    void remove(int x) {
        assert(size());
        if (x <= get()) {
            assert(l.find(x) != l.end());
            l.erase(l.find(x));
            lsum -= x;
        } else {
            assert(r.find(x) != r.end());
            r.erase(r.find(x));
            rsum -= x;
        }
        balance();
    }
    
} median;

int a[N];

int main() {
#ifdef TEST
    freopen("zz.in", "r+", stdin);
#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t; cin >> t;
    while (t --) {
        median.init();

        ll n, k; cin >> n >> k;
        for (int i = 1; i <= n; ++ i) cin >> a[i], a[i] -= i;

        int res = 0;
        for (int i = 1, j = 1; i <= n; ++ i) {
            median.add(a[i]);
            while (j < n && median.cost() <= k) median.add(a[++ j]);
            while (median.cost() > k) median.remove(a[j --]);
            res = max(res, j - i + 1);
            median.remove(a[i]);
        }        
        cout << res << '\n';
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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
Wrong Answer
time: 183ms
memory: 5992kb

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
1
2
6
5
7
2
4
1
4
1
1
2
2
2
7
5
7
7
1
6
5
2
4
3
1
3
7
7
3
4
3
9
3
8
6
6
1
1
5
1
1
2
4
6
2
6
4
1
3
6
1
6
3
5
5
6
1
5
5
3
1
6
3
5
3
2
2
6
1
3
10
1
3
1
1
4
5
1
6
5
5
5
8
5
3
6
3
5
5
8
5
3
5
2
1
5
2
2
3
3
8
1
3
1
2
2
6
3
1
6
8
1
8
4
5
6
6
8
2
8
3
2
8
4
5
6
2
6
2
3
1
5
4
5
2
2
4
1
2
1
2
3
6
3
6
3
3
2...

result:

wrong answer 3rd lines differ - expected: '3', found: '1'