QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#695324#7904. Rainbow SubarrayljljljljRE 0ms0kbC++205.3kb2024-10-31 19:47:102024-10-31 19:47:11

Judging History

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

  • [2024-10-31 19:47:11]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-10-31 19:47:10]
  • 提交

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 << " " << idx[middle.second] << " ";
        auto it1 = tr.queryBig(idx[middle.second]), it2 = tr.querySmall(idx[middle.second]);
        i64 tmp = middle.first * it2.second - it2.first + (it1.first - it1.second * middle.first);
        // cout << tmp << endl;
        // cout << "---------------\n";
        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);
            while (s1.size() > (len + 1) / 2)
            {
                auto it = *s1.rbegin();
                s2.insert(it);
                s1.erase(s1.find(it));
            }
            // cout << "in s1\n";
            // for (auto &it : s1)
            //     cout << it.first << " " << it.second << endl;
            // cout << "in s2\n";
            // for (auto &it : s2)
            //     cout << it.first << " " << it.second << endl;
            // cout << "-------------------------\n";
            while (s1.size() && s2.size() && s1.rbegin()->first > s2.begin()->first)
            {
                auto it = s2.begin();
                auto it2 = s1.rbegin();
                s1.insert(*it);
                s2.insert(*it2);
                s2.erase(s2.find(*it));
                s1.erase(s1.find(*it2));
            }
            if (!check())
                break;
            else
                R++;
        }
        // cout << "R--------------\n";
        ans = max(ans, R - L);
        while (len > 1 && L < R)
        {
            // cout << L << " " << R << endl;
            tr.erase(idx[L], a[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)));
            // cout << len << endl;
            while (s2.size() && s1.size() < (len + 1) / 2)
            {
                auto it = *s2.begin();
                s1.insert(it);
                s2.erase(s2.find(it));
            }
            while (s1.size() && s2.size() && s1.rbegin()->first > s2.begin()->first)
            {
                auto it = s2.begin();
                auto it2 = s1.rbegin();
                s1.insert(*it);
                s2.insert(*it2);
                s2.erase(s2.find(*it));
                s1.erase(s1.find(*it2));
            }
            // cout << "in s1\n";
            // for (auto &it : s1)
            //     cout << it.first << " " << it.second << endl;
            // cout << "in s2\n";
            // for (auto &it : s2)
            //     cout << it.first << " " << it.second << endl;
            // cout << "-------------------------\n";

            L++;
            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: 0
Dangerous Syscalls

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

result: