How E&&求调
  • 板块学术版
  • 楼主Comars
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/28 21:42
  • 上次更新2024/9/29 10:46:01
查看原帖
How E&&求调
784856
Comars楼主2024/9/28 21:42

rt.

AC 23 WA 20

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,k,s[200005],ans[200005];
struct node{
	int val,pos;
}a[200005];
bool cmp(node a,node b){return a.val>b.val;}
bool check1(int x,int y,int l,int z){//到哪一位,他的选票
	if(x>=z){
		int t=s[x]-a[z].val;
		if((y+1ll)*(x-1ll)-t<=l) return true;
		else return false;
	}else{
		int t=s[x];
		if((y+1ll)*x-t<=l) return true;
		else return false;
	}
}
bool check(int x,int y,int z){//ta的选票,还剩下的选票,他是哪一位
	int l=1,r=n;
	while(r-l>5){
		int mid=(l+r)>>1ll;
		if(check1(mid,x,y,z)) l=mid;
		else r=mid;
	}
	//cout<<x<<" "<<y<<" "<<z<<endl;
	for(int i=r;i>=l;i--)
		if(check1(i,x,y,z)){/*cout<<"_)_"<<i<<" "<<x<<" "<<y<<" "<<z<<" "<<check1(i,x,y,z)<<endl;*/return(i>=z?i<=m:i<=m-1);}
	return true;
}
signed main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) cin>>a[i].val,k-=a[i].val,a[i].pos=i;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i].val;
	for(int i=1;i<=n;i++){
		int l=0,r=k,flag=0;
		while(r-l>5){
			int mid=(l+r)>>1ll;
			if(check(a[i].val+mid,k-mid,i)) r=mid;
			else l=mid;
		}
		for(int j=l;j<=r;j++)
			if(check(a[i].val+j,k-j,i)){ans[a[i].pos]=j;flag=1;break;}
		if(!flag) ans[a[i].pos]=-1;
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
}
2024/9/28 21:42
加载中...