QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#688162#7904. Rainbow SubarrayAAAAAZBXWA 186ms6480kbC++202.5kb2024-10-29 23:59:072024-10-29 23:59:08

Judging History

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

  • [2024-10-29 23:59:08]
  • 评测
  • 测评结果:WA
  • 用时:186ms
  • 内存:6480kb
  • [2024-10-29 23:59:07]
  • 提交

answer

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<set>
#include<queue>
#define x first
#define y second
using namespace std;
const double PI = acos(-1);
const int N = 5e5 + 10;
typedef long long ll;
typedef pair<ll, ll> PII;
int n;
ll a[N], k;
struct MID {
    multiset<ll, greater<ll>>p;//存储较小部分,begin为最大值
    multiset<ll>q;//存储较大部分,begin为最小值
    ll sump, sumq;
    MID() {
        sump = sumq = 0;
    }
    void move() {
        if (abs((int)p.size() - (int)q.size()) > 1) {
            if (p.size() > q.size()) {
                auto t = *p.begin();
                p.extract(t), q.insert(t);
                sump -= t, sumq += t;
            }
            else {
                auto t = *q.begin();
                q.extract(t), p.insert(t);
                sumq -= t, sump += t;
            }
        }
    }
    void add(ll x) {
        if (!p.size() || x <= *p.begin()) {
            p.insert(x);
            sump += x;
        }
        else {
            q.insert(x);
            sumq += x;
        }
        move();
    }
    void del(ll x) {
        if (p.count(x)) {
            p.extract(x);
            sump -= x;
        }
        else {
            q.extract(x);
            sumq -= x;
        }
        move();
    }
    ll get() {
        ll mid = 0;
        if (p.size() && p.size() >= q.size())mid = *p.begin();
        else if (q.size())mid = *q.begin();
        return mid * p.size() - sump + sumq - mid * q.size();
    }
    ll getmid() {
        ll mid = 0;
        if (p.size() && p.size() >= q.size())mid = *p.begin();
        else if (q.size())mid = *q.begin();
        return mid;
    }
    int size() {
        return p.size() + q.size();
    }
};
int main() {
    int _ = 1;
    scanf("%d", &_);
    while (_--) {
        scanf("%d%lld", &n, &k);
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
            a[i] -= i;
        }
        //for (int i = 1; i <= n; i++)cout << a[i] << " ";
        //cout << '\n';
        MID s;
        int ans = 1;
        for (int r = 0, l = 1; l <= n; l++) {
            while (r < n) {
                s.add(a[++r]);
                if (s.get() > k) {
                    s.del(a[r--]);
                    break;
                }
            }
            ans = max(ans, r - l + 1);
            s.del(a[l]);
        }
        printf("%d\n", ans);
    }
    return 0;
}

詳細信息

Test #1:

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

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: 186ms
memory: 6480kb

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
4
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
4
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
3
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 16th lines differ - expected: '2', found: '4'