QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#369151#7904. Rainbow SubarrayHuLiangyu#WA 78ms5676kbC++142.4kb2024-03-27 21:07:082024-03-27 21:07:42

Judging History

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

  • [2024-06-09 00:00:26]
  • hack成功,自动添加数据
  • (/hack/652)
  • [2024-03-27 21:07:42]
  • 评测
  • 测评结果:WA
  • 用时:78ms
  • 内存:5676kb
  • [2024-03-27 21:07:08]
  • 提交

answer

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;
using ll = long long;
ll n,k;
const int N = 5e5+100;
int a[N];
int in_que[N];

using Pair = pair<int, int>;

priority_queue<Pair, vector<Pair>, greater<Pair> > xq;
priority_queue<Pair, vector<Pair>, less<Pair> > nq;
ll lssum, mxsum;
int cntls, cntmx;

void toss() {
    while (cntls < cntmx - 1) {
        auto t = xq.top(); xq.pop();
        if (in_que[t.second] == 2) cntmx --, mxsum -= t.first;
        else continue;
        nq.push(t); cntls ++; lssum += t.first;
        in_que[t.second] = 1;
    }
    while (cntls > cntmx) {
        auto t = nq.top(); nq.pop();
        if (in_que[t.second] == 1) cntls --, lssum -= t.first;
        else continue;
        xq.push(t); cntmx ++; mxsum += t.first;
        in_que[t.second] = 2;
    }
}

void add(int x, int idx) {
    if (xq.size() == 0) {
        xq.push(make_pair(x, idx));
        in_que[idx] = 2;
        mxsum += x;
        cntmx ++;
        return;
    } 
    if (x < xq.top().first) {
        nq.push(make_pair(x, idx));
        in_que[idx] = 1;

        lssum += x;
        cntls ++;
    } else {
        xq.push(make_pair(x, idx));
        in_que[idx] = 2;

        mxsum += x;
        cntmx ++;
    }
    toss();
}

void del(int idx) {
    if (in_que[idx] == 1) {
        in_que[idx] = 0;
        cntls --;
        lssum -= a[idx];
    } else if (in_que[idx] == 2) {
        in_que[idx] = 0;
        cntmx --;
        mxsum -= a[idx];
    }
    toss();
}

int get_mid() {
    if (xq.empty()) exit(1);
    return xq.top().first;
}

ll get_tk() {
    return mxsum - 1ll * cntmx * get_mid() + 1ll * cntls * get_mid() - lssum;
}

void sol() {
    cin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        a[i] -= i;
        in_que[i] = 0;
    }    
    while (!nq.empty()) nq.pop();
    while (!xq.empty()) xq.pop();
    lssum = 0;
    mxsum = 0;
    cntls = 0;
    cntmx = 0;
    int l = 1, ans = 1;
    for (int i = 1; i <= n; ++i) {
        add(a[i], i);
        while (get_tk() > k) {
            del(l);
            ++l;
        }
        ans = max(i - l + 1, ans);
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T --) {
        sol();
    }    
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5676kb

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: 78ms
memory: 5252kb

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:

wrong answer 215th lines differ - expected: '5', found: '4'