萌新树状数组70pts求助
查看原帖
萌新树状数组70pts求助
560516
喵仔牛奶楼主2022/9/26 21:32

https://www.luogu.com.cn/record/87675082

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long ll;
ll n, m, k, qaq, cnt, ans = INT_MAX, h[N], pos[N], a[N], t[N];
struct tree {
	ll a[N], c[N];
	int lowbit(int x) {
		return x & -x;
	}
	void add(int x, ll val) {
		a[x] += val;
		for (; x <= cnt; x += lowbit(x)) c[x] += val;
	}
	ll query(int x) {
		ll res = 0;
		for (; x; x -= lowbit(x)) res += c[x];
		return res;
	}
	int Kth(int k) {
		int ans = 0, sum = 0;
		for (int i = 20; i >= 0; i --)
			if (ans + (1 << i) <= cnt && sum + c[ans + (1 << i)] < k)
				ans += 1 << i, sum += c[ans];
		return ans + 1;
	}
} qwq, num;
int main() {
	cin >> n >> k;
	for (int i = 1; i <= n; i ++)
		cin >> a[i], h[i] = t[i] = a[i];
	sort(t + 1, t + 1 + n), cnt = unique(t + 1, t + 1 + n) - t - 1;
	for (int i = 1; i <= n; i ++)
		a[i] = lower_bound(t + 1, t + 1 + cnt, a[i]) - t;
	for (int i = 1; i < k; i ++)
		qwq.add(a[i], 1), num.add(a[i], h[i]);
	for (int i = 1; i + k - 1 <= n; i ++) {
		int pos = i + k - 1;
		qwq.add(a[pos], 1), num.add(a[pos], h[pos]);
		ll e = (k + 1) / 2, mid = qwq.Kth(e), sum = t[mid];
		ll awa = sum * e - num.query(mid) + num.query(cnt) - num.query(mid) - sum * (k - e);
		if (ans > awa) ans = awa, m = i, qaq = sum;
		qwq.add(a[i], -1), num.add(a[i], -h[i]);
	}
	cout << ans << '\n';
	for (int i = 1; i < m; i ++) cout << h[i] << '\n';
	for (int i = m; i <= m + k - 1; i ++) cout << qaq << '\n';
	for (int i = m + k; i <= n; i ++) cout << h[i] << '\n';
	return 0;
}
2022/9/26 21:32
加载中...