QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#644123#7904. Rainbow Subarray666ldcWA 772ms6608kbC++173.2kb2024-10-16 11:05:332024-10-16 11:05:34

Judging History

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

  • [2024-10-16 11:05:34]
  • 评测
  • 测评结果:WA
  • 用时:772ms
  • 内存:6608kb
  • [2024-10-16 11:05:33]
  • 提交

answer

#pragma GCC optimize(2)
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define int long long
#define endl '\n'
using i128 = __int128;
using i64 = long long;
using f128 = long double;
using u64 = unsigned long long;
using pii = pair<int, int>;
const int INF = 0x3f3f3f3f, mod = 1e9 + 7;
const i64 inf = 2e18;
//-------------------------------------------

struct st_tree
{
    int n;
    vector<int> p;
    st_tree(int _n) : p(_n + 1), n(_n) {};

    void init(int _n)
    {
        for (int i = 1; i <= n; i++)
            p[i] = 0;
        n = _n;
    }

    int lowbit(int x)
    {
        return x & -x;
    }

    void add(int u, int d)
    {
        while (u <= n)
            p[u] += d, u += lowbit(u);
    }

    int find(int u)
    {
        int sum = 0;
        while (u > 0)
        {
            sum += p[u], u -= lowbit(u);
        }
        return sum;
    }
};

void solve()
{
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        a[i] = a[i] - i;
    }

    int num = *min_element(a.begin(), a.end());
    vector<int> hx;
    if (num <= 0)
    {
        num = abs(num);
        for (int i = 1; i <= n; i++)
        {
            a[i] += num + 1;
        }
    }
    hx.push_back(-1);
    for (int i = 1; i <= n; i++)
    {
        hx.push_back(a[i]);
    }
    sort(hx.begin(), hx.end());
    hx.erase(unique(hx.begin(), hx.end()), hx.end());

    auto find = [&](int num)
    {
        return lower_bound(hx.begin(), hx.end(), num) - hx.begin();
    };

    int m = hx.size() - 1;
    st_tree stt(m), cnt(m);

    auto cal = [&](int x, int mid)
    {
        int id = find(x);
        int sum = 0;
        sum += cnt.find(id - 1) * mid - stt.find(id - 1);
        sum += (stt.find(m) - stt.find(id - 1)) - (cnt.find(m) - cnt.find(id - 1)) * mid;
        return sum;
    };

    auto check = [&](int x)
    {
        int sum = 0;
        stt.init(m);
        cnt.init(m);
        // cerr << x << endl;
        for (int r = 1; r <= n; r++)
        {
            int id = find(a[r]);
            sum += a[r];
            stt.add(id, a[r]);
            cnt.add(id, 1);
            if (r >= x)
            {
                int midl = sum / x, midr = sum / x + 1;
                int w = min(cal(midl, midl), cal(midr, midr));
                // cerr << w << " " << r << endl;
                if (w <= k)
                    return true;
                int idl = find(a[r - x + 1]);
                sum -= a[r - x + 1];
                stt.add(idl, -a[r - x + 1]);
                cnt.add(idl, -1);
            }
        }
        return false;
    };

    int l = 1, r = n;
    check(2);
    while (r > l)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid))
            l = mid;
        else
            r = mid - 1;
    }

    cout << l << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    cin >> T;
    for (int i = 1; i <= T; i++)
        solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 772ms
memory: 6608kb

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

result:

wrong answer 17th lines differ - expected: '7', found: '6'