就WA了hand11txt,悬关求调
查看原帖
就WA了hand11txt,悬关求调
1368189
znzryb楼主2024/10/15 00:11
#include <iostream>
#include <algorithm>
#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;
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 diff=0;
    ll overi=n+1-(upper_bound(&a[1],&a[n+1],currBallots)-&a[0]); // 返回的是比他大的数的索引,要包含这个数,n+1-。。。
    ll needOver=m-overi,rectify=0,rectifyIdx=0;
    // 防止选用自己作为自己的竞争对手
    ll candidateIdx=li[indexOfCandidate]-1;
    if(candidateIdx<=idx && candidateIdx>idx-needOver) {
        rectify=oa[indexOfCandidate],rectifyIdx=1;
    }
    diff=gainBallots+(currBallots+1)*needOver-(sumA[idx]-sumA[idx-needOver-rectifyIdx]-rectify);
    // 就是下面循环的前缀和写法
    // for(ll i=idx;cnt<needOver;i--) {
    //     diff+=(currBallots+1-a[i]);
    //     cnt++;
    // }
    if(diff>remain)     // diff需要严格大于remain,不能等于,因为等于是可以超过的
        return true;
    return false;
}
inline ll bsearch(ll i) {       // 二分模版
    ll l=0,r=remain;
    while(l<r) {
        ll mid=l+r>>1;
        if(check(mid,i))
            r=mid;      // mid是有可能是答案的,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];
        oa[i]=a[i];
    }
    remain=k-countedBallots;
    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++) {
        // 返回第一个比寻找元素大的元素 -&a[0]后就是索引 所以其实lower_bound()不太支持降序排列离散化
        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(oa[i]+remain<stand) {    // 直接加都不行,跳过
            ans[i]=-1;continue;
        }
        ans[i]=bsearch(i);
    }
    for(int i=1;i<=n;i++) {
        cout<<ans[i]<<" ";
    }
    return 0;
}
// 只WA了一个点 https://atcoder.jp/contests/abc373/submissions/58815831
2024/10/15 00:11
加载中...