template<classT> structDualHeap {//结合可删堆,形成可删对顶堆 Heap<T, std::greater<T>> small; // small root Heap<T, std::less<T>> big; // big root DualHeap() {} voidupdate(){ if (big.size() == 0and small.size() == 0) { return; } while (big.size() > small.size() + 1) { T x = big.top(); big.pop(); small.push(x); } while (big.size() < small.size()) { T x = small.top(); small.pop(); big.push(x); } } voidpush(T val){ if (big.size() == 0) { big.push(val); return; } if (val <= big.top()) { big.push(val); } else { small.push(val); } update(); } voiderase(T val){ assert(big.size() >= 1); if (val <= big.top()) { big.erase(val); } else { small.erase(val); } update(); }
i64 getResult(){ if (big.size() == 0) {return0;}//说明只有一个数 int x{big.top()}; i64 ans1 = 1LL * x * big.size() - big.sum;//比中位数小的数的贡献 i64 ans2 = small.sum - 1LL * x * small.size();//比中位数大的数的贡献 return ans1 + ans2; }
};
voidsolve() { #define tests int n; i64 k; std::cin >> n >> k; std::vector<int> a(n); for (auto& ai : a) {std::cin >> ai; --ai;} for (int i = 0; i < n; i++) {a[i] -= i;} DualHeap<int> dheap; int ans{}; for (int l = 0, r = 0; r < n; r++) {//这题固定右指针,移动左指针更方便 dheap.push(a[r]); while (l <= r and dheap.getResult() > k) {//如果不满足条件,就继续移动左指针 dheap.erase(a[l]); l += 1; } ans = std::max(ans, r - l + 1); } std::cout << ans << '\n';