QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#695107#7904. Rainbow SubarrayljljljljWA 226ms7332kbC++204.0kb2024-10-31 19:20:352024-10-31 19:20:36

Judging History

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

  • [2024-10-31 19:20:36]
  • 评测
  • 测评结果:WA
  • 用时:226ms
  • 内存:7332kb
  • [2024-10-31 19:20:35]
  • 提交

answer

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
using i64 = long long;
const int inf = numeric_limits<int>::max();
struct Info
{
    i64 val = 0;
    int cnt = 0;
};

struct BIT
{
    vector<Info> tree;
    int n;
    BIT(int n) : tree(n + 1), n(n) {}
    inline int lowbit(int n)
    {
        return n & -n;
    }
    void update(int idx, i64 val)
    {
        while (idx <= n)
            tree[idx].val += val, tree[idx].cnt += 1, idx += lowbit(idx);
    }
    void erase(int idx, i64 val)
    {
        while (idx <= n)
            tree[idx].val -= val, tree[idx].cnt -= 1, idx += lowbit(idx);
    }
    pair<i64, i64> querySmall(int idx)
    {
        i64 ans = 0, cnt = 0;
        while (idx)
            ans += (tree[idx].val), cnt += tree[idx].cnt, idx -= lowbit(idx);
        return make_pair(ans, cnt);
    }
    pair<i64, i64> queryBig(int idx)
    {
        auto it = querySmall(idx);
        int id = n;
        i64 res1 = 0, res2 = 0;
        while (id)
            res1 += tree[id].val, res2 += tree[id].cnt, id -= lowbit(id);
        res1 -= it.first, res2 -= it.second;
        return make_pair(res1, res2);
    }
};

// const int N =

void solve()
{
    int n;
    i64 k;
    int timer = 0;
    cin >> n >> k;
    vector<int> a(n + 1);
    vector<int> idx(n + 1);
    vector<int> sorted(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i], a[i] -= i;
        sorted[i] = a[i];
    }
    sort(sorted.begin() + 1, sorted.end());
    sorted.erase(unique(sorted.begin(), sorted.end()), sorted.end());
    // for (int i = 1; i <= n; i++)
    //     cout << a[i] << " \n"[i == n];
    for (int i = 1; i <= n; i++)
        idx[i] = lower_bound(sorted.begin() + 1, sorted.end(), a[i]) - sorted.begin();
    // for (int i = 1; i <= n; i++)
    //     cout << idx[i] << " \n"[i == n];
    BIT tr(sorted.size() + 1);
    multiset<pair<int, int>> s1, s2;
    int L = 1, R = 2;
    auto check = [&]() -> bool
    {
        // cout << L << " " << R << endl;
        auto middle = *s1.rbegin();
        // cout << middle.first << " " << middle.second << endl;
        auto res = tr.querySmall(idx[middle.second]), res2 = tr.queryBig(idx[middle.second]);
        // cout << res.first << " " << res.second << " " << res2.first << " " << res2.second << endl;
        i64 tmp = middle.first * res.second - res.first + (res2.first - middle.first * res2.second);
        // cout << tmp << endl;
        return tmp <= k;
    };
    s1.emplace(a[1], idx[1]);
    tr.update(idx[L], a[L]);
    int ans = 1, len = 1;
    while (R <= n)
    {
        while (R <= n)
        {
            // cout << L << " " << R << endl;
            len += 1;
            tr.update(idx[R], a[R]);
            s1.emplace(a[R], R);
            if (s1.size() > (len + 1) / 2)
            {
                auto it = *s1.rbegin();
                s2.insert(it);
                s1.erase(s1.find(it));
            }
            if (!check())
                break;
            R++;
        }
        // cout << "R--------------\n";
        ans = max(ans, R - L);
        while (L < R)
        {
            // cout << L << " " << R << endl;
            tr.erase(idx[L], a[L]);
            L++;
            len -= 1;
            if (s1.count(make_pair(a[L], L)))
                s1.erase(s1.find(make_pair(a[L], L)));
            else if (s2.count(make_pair(a[L], L)))
                s2.erase(s2.find(make_pair(a[L], L)));
            if (s2.size() && s1.size() < (len + 1) / 2)
            {
                auto it = *s2.begin();
                s1.insert(it);
                s2.erase(s2.find(it));
            }
            if (!check())
                break;
        }
        // cout << "L--------------\n";
        R++;
    }
    cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        solve();
    // system("pause");
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 226ms
memory: 7332kb

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

result:

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