站外题求助:BZOJ3580冒泡排序
  • 板块学术版
  • 楼主T20201126
  • 当前回复14
  • 已保存回复14
  • 发布时间2022/8/27 21:56
  • 上次更新2023/10/27 13:23:50
查看原帖
站外题求助:BZOJ3580冒泡排序
419474
T20201126楼主2022/8/27 21:56
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1000050;
ll n,k,a[N],tree[N],g[N],q,b[N],f[N];
ll l,r,mid;
ll lowbit(ll x){return x&(-x);}
ll query(ll x)
{
	ll now=0;
	for(int i=x;i>0;i-=lowbit(i)) now+=tree[i];
	return now;
}
void add(ll x)
{
	for(int i=x;i<=n+1;i+=lowbit(i))
		tree[i]+=1;
	return ;
}
ll shou(ll x)
{
	ll now=0;
	for(int i=1;i<=n;++i)
		now+=min(g[i],x);
	return now;
}
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=n;++i)
	{
		g[i]=query(n+1)-query(a[i]);
		add(a[i]);
	}
	l=0;r=n;
	while(l<r)
	{
		mid=(l+r+1)/2;
		if(shou(mid)>=k) r=mid-1;
		else l=mid;
	}
	if(l==n)
	{
		printf("Impossible!");
		return 0;
	}
	k-=shou(l);q=0;
	for(int i=1;i<=n;++i) 
	if(g[i]<=l) f[++q]=a[i];
	else b[i-l]=a[i];
	sort(f+1,f+1+q);
	q=0;
	for(int i=1;i<=n;++i) 
	if(!b[i]) b[i]=f[++q];
	for(int j=1;j<n;++j) 
	if(b[j]>b[j+1])
	{
		swap(b[j],b[j+1]);
		--k;if(k==0) break;
	}
	for(int i=1;i<=n;++i) 
		printf("%lld ",b[i]);
	return 0;
}

校内网测只有50 TLE

2022/8/27 21:56
加载中...