10pts求调
查看原帖
10pts求调
576817
Lyrella楼主2022/8/18 08:42
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, k, t, a[N], rt, sz, lsum, rsum, ans;
struct tree
{
	int fa, son[2], siz, sum, num, key;
	void clear(){
		fa = son[0] = son[1] = siz = sum = num = key;
	}
}tr[N];
inline bool loc(int x){return tr[tr[x].fa].son[1] == x;}
inline void upd(int x)
{
	if(!x)return;
	tr[x].siz = tr[x].num;
	tr[x].sum = tr[x].num * tr[x].key;
	if(tr[x].son[0])tr[x].siz += tr[tr[x].son[0]].siz, tr[x].sum += tr[tr[x].son[0]].sum;
	if(tr[x].son[1])tr[x].siz += tr[tr[x].son[1]].siz, tr[x].sum += tr[tr[x].son[1]].sum;
}
inline void rot(int x)
{
	int bb = tr[x].fa, yy = tr[bb].fa, fl = loc(x);
	tr[bb].son[fl] = tr[x].son[fl xor 1];
	tr[tr[bb].son[fl]].fa = bb;
	tr[x].son[fl xor 1] = bb;
	tr[bb].fa = x;
	tr[x].fa = yy;
	if(yy)tr[yy].son[tr[yy].son[1] == bb] = x;
	upd(bb); upd(x);
}
inline void splay(int x)
{
	for(int bb; bb = tr[x].fa; rot(x))if(tr[bb].fa)rot(loc(x) == loc(bb) ? bb : x);
	rt = x;
}
inline void find(int x)
{
	if(!rt)return;
	int r = rt;
	while(tr[r].son[x > tr[r].key] and tr[r].key != x)r = tr[r].son[x > tr[r].key];
	splay(r);
}
inline int pre()
{
	int x = tr[rt].son[0];
	while(tr[x].son[1])x = tr[x].son[1];
	return x;
}
inline void ins(int x)
{
	if(!rt)
	{
		tr[++sz].fa = tr[sz].son[0] = tr[sz].son[1] = 0;
		tr[sz].siz = tr[sz].num = 1;
		tr[sz].key = tr[sz].sum = x;
		rt = sz;
		return;
	}
	int u = rt, bb = 0;
	while(true)
	{
		if(x == tr[u].key)
		{
			tr[u].num++;
			tr[u].sum += tr[u].key;
			upd(u); upd(bb); splay(u);
			return;
		}
		bb = u; u = tr[u].son[x > tr[u].key];
		if(!u)
		{
			tr[++sz].son[0] = tr[sz].son[1] = 0;
			tr[sz].siz = tr[sz].num = 1;
			tr[sz].key = tr[sz].sum = x;
			tr[sz].fa = bb; tr[bb].son[x > tr[bb].key] = sz;
			upd(bb);
			splay(sz);
			return;
		}
	}
}
inline void del(int x)
{
	find(x);
	if(tr[rt].num > 1)
	{
		tr[rt].num--;
		tr[rt].sum -= tr[rt].key;
		upd(rt);
		return;
	}
	if(!tr[rt].son[0] and !tr[rt].son[1])
	{
		tr[rt].clear(); rt = 0;
		return;
	}
	if(!tr[rt].son[0])
	{
		int r = rt;
		rt = tr[rt].son[1];
		tr[rt].fa = 0;
		tr[r].clear();
		return;
	}
	if(!tr[rt].son[1])
	{
		int r = rt;
		rt = tr[rt].son[0];
		tr[rt].fa = 0;
		tr[r].clear();
		return;
	}
	int r = rt, pr = pre();
	splay(pr);
	tr[rt].son[1] = tr[r].son[1];
	tr[tr[r].son[1]].fa = rt;
	tr[r].clear();
	upd(rt);
}
inline int kth(int x)
{
	int r = rt;
	while(1)
	{
		if(tr[r].son[0] and x <= tr[tr[r].son[0]].siz)
		{
			rsum += tr[r].key * tr[r].num + tr[tr[r].son[1]].sum;
			r = tr[r].son[0];
		}
		else if(x > tr[tr[r].son[0]].siz + tr[r].num)
		{
			lsum += tr[r].key * tr[r].num + tr[tr[r].son[0]].sum;
			x -= tr[tr[r].son[0]].siz + tr[r].num;
			r = tr[r].son[1];
		}
		else
		{
			lsum += tr[tr[r].son[0]].sum + tr[r].key * (x - tr[tr[r].son[0]].siz - 1);
			rsum += tr[tr[r].son[1]].sum + tr[r].key * (tr[tr[r].son[0]].siz - x + tr[r].num);
			return tr[r].key;
		}
	}
}
signed main()
{
	cin >> n >> k;
	for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
	t = k + 1 >> 1;
	for(int i = 1; i <= k; i++)ins(a[i]);
	int l = 1, r = k;
	lsum = rsum = 0;
	int mid = kth(t);
	ans = (2 * t - 1 - k) * mid - lsum + rsum;
	for(int i = k + 1; i <= n; i++)
	{
		ins(a[i]); del(a[i - k]);
		lsum = rsum = 0;
		int midd = kth(t); int anss = (2 * t - 1 - k) * midd - lsum + rsum;
		if(anss < ans)ans = anss, mid = midd, l = i - k + 1, r = i;
	}
	cout << ans;
	for(int i = 1; i <= n; i++)printf("\n%lld", i >= l and i <= r ? mid : a[i]);
	return 0;
}
2022/8/18 08:42
加载中...