1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include <iostream> #include <algorithm> #include <set> #include <cmath> using namespace std; typedef long long ll; const ll N=2e5+10; ll n,m,k,a[N],countedBallots,remain,li[N],ans[N],oa[N],sumA[N]; ll stand=1e18; set<ll> vis; inline bool check(ll gainBallots,ll indexOfCandidate) { ll currBallots=oa[indexOfCandidate]+gainBallots; if(currBallots<stand) return false; ll idx=upper_bound(&a[1],&a[n+1],currBallots)-&a[0]-1; ll overi=n+1-(upper_bound(&a[1],&a[n+1],currBallots)-&a[0]); ll needOver=m-overi; ll cnt=0,diff=gainBallots; for(ll i=idx;cnt<needOver;i--) { diff+=(currBallots+1-a[i]); cnt++; } if(diff>remain) return true; return false; } inline ll bsearch(ll i) { ll l=stand-oa[i],r=remain; while(l<r) { ll mid=l+r>>1; if(check(mid,i)) r=mid; else l=mid+1; } return l; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>m>>k; for(int i=1;i<=n;i++) { cin>>a[i]; countedBallots+=a[i]; } remain=k-countedBallots; for(int i=1;i<=n;i++) { oa[i]=a[i]; } sort(&a[1],&a[n+1]); for(int i=1;i<=n;i++) { sumA[i]=sumA[i-1]+a[i]; } for(int i=1;i<=n;i++) { li[i]=upper_bound(&a[1],&a[n+1],oa[i])-&a[0]; if(n+1-li[i]<m) stand=min(stand,oa[i]); } for(int i=1;i<=n;i++) { if(vis.count(oa[i])) continue; ll s=lower_bound(&a[1],&a[n+1],oa[i])-&a[0]; ll e=upper_bound(&a[1],&a[n+1],oa[i])-&a[0]; vis.insert(oa[i]); } for(int i=1;i<=n;i++) { ll ia=li[i]-1,vi=oa[i],overi=n+1-li[i]; if(oa[i]+remain<stand) { ans[i]=-1;continue; } if(oa[i]>=stand) { ll diff=0,cnt=0,needOver=m-overi; for(ll j=ia-1;cnt<needOver;j--) diff+=vi-a[j],cnt+=1; if(remain-diff<0) { ans[i]=0;continue; }else { ans[i]=ceil((remain-diff)*1.0/(cnt+1)); } }else { ans[i]=bsearch(i); } } for(int i=1;i<=n;i++) { cout<<ans[i]<<" "; } return 0; }
|