QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#570684#7904. Rainbow Subarrayrxzfn639Compile Error//C++233.3kb2024-09-17 17:07:092024-09-17 17:07:11

Judging History

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

  • [2024-09-17 17:07:11]
  • 评测
  • [2024-09-17 17:07:09]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define int long long
using i64 = long long;
const i64 P = 998244353;
struct BIT {
    int n;
    vector<i64> w;

    BIT() {}
    BIT(int n) {
        this->n = n; // 注意 n 不能 +1
        w.resize(n + 1);
    }
    void add(int x, i64 k) {
        for (; x <= n; x += x & -x) {
            w[x] += k;
        }
    }
    void add(int x, int y, i64 k) {
        add(x, k), add(y, -k);
    }
    i64 ask(int x) {
        i64 ans = 0;
        for (; x; x -= x & -x) {
            ans += w[x];
        }
        return ans;
    }
    i64 ask(int x, int y) {
        return ask(y) - ask(x - 1);
    }
    int kth(int k) { // ex: 查找第k大的值
        int ans = 0;
        for (int i = __lg(n); i >= 0; i--) {
            int val = ans + (1 << i);
            if (val < n && w[val] < k) {
                k -= w[val];
                ans = val;
            }
        }
        return ans + 1;
    }
    i64 get(auto val) { // ex: 获取逆序对数量
        this->n = val.size(); // 注意 n 不能 +1
        w.resize(n + 1);

        vector<pair<int, int>> alls;
        for (int i = 0; i < n; i++) { // 输入从0开始
            alls.emplace_back(val[i], i + 1);
        }
        sort(alls.begin(), alls.end());

        i64 ans = 0;
        for (auto [val, idx] : alls) {
            ans += 1ll * ask(idx + 1, n);
            add(idx, 1);
        }
        return ans;
    }
};
void solve() {
    int n;
    i64 k;
    cin >> n >> k;
    vector<i64> a(n), h(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        a[i] += n - i;
        h[i] = a[i];
    }
    sort(h.begin(), h.end());
    h.erase(unique(h.begin(), h.end()), h.end());
    unordered_map<i64, int> mp;
    for (int i = 0; i < h.size(); i++) {
        mp[h[i]] = i + 1;
    }
    int ans = 0;
    BIT t1(n), t2(n);
    auto col = [&](int l, int r) -> i64 {
        int mid = (r - l + 2) / 2;
        int pos = t1.kth(mid);
        i64 sma = t2.ask(pos), big = t2.ask(pos + 1, n);
        i64 siz1 = t1.ask(pos), siz2 = t1.ask(pos + 1, n);
        i64 val = h[pos - 1];
        // cout << sma << ' ' << big << ' ' << siz1 << ' ' << siz2 << ' ' << val << '\n';
        i64 ans1 = siz1 * val - sma + big - siz2 * val;
        mid++;
        if (t1.kth(mid) != pos) {
            pos = t1.kth(mid);
            sma = t2.ask(pos), big = t2.ask(pos + 1, n);
            siz1 = t1.ask(pos), siz2 = t1.ask(pos + 1, n);
            val = h[pos - 1];
            i64 ans2 = siz1 * val - sma + big - siz2 * val;
            return min(ans1, ans2);
        }
        return ans1;
    };
    for (int l = 0, r = 0; r < n; r++) {
        t1.add(mp[a[r]], 1);
        t2.add(mp[a[r]], a[r]);
        // cout << l << ' ' << r << ' ' << col(l, r) << '\n';
        while (col(l, r) > k) {
            t1.add(mp[a[l]], -1);
            t2.add(mp[a[l]], -a[l]);
            l++;
        }
        // cout << l << ' ' << r << ' ' << col(l, r) << '\n';
        ans = max(ans, r - l + 1);
    }
    cout << ans << '\n';
}
int main() {
    ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    int t = 1; 
    cin >> t;
    while(t--) solve();
    return 0;
}
/*
1
6 0
100 3 4 5 99 100

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
*/

Details

cc1plus: error: ‘::main’ must return ‘int’