社区讨论

在线等help

AT_abc155_d [ABC155D] Pairs参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m1j2qbu5
此快照首次捕获于
2024/09/26 17:10
去年
此快照最后确认于
2025/11/04 18:45
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,cnt;
vector<int> x,y;
bool check(int mid){
    int to=0;
    if(mid<0){
        for(int i=0;i<x.size();i++){
            int now=mid/x[i];
            if(mid%x[i]==0){
                now--;
            }
            to+=upper_bound(y.begin(),y.end(),now)-y.begin();
        }
    }
    else if(mid==0){
        to+=x.size()*y.size();
    }
    else{
        to+=x.size()*y.size();
        to+=cnt*(x.size()+y.size());
        to+=cnt*(cnt-1)/2;
        for(int i=0;i<x.size();i++){
            int now=mid/x[i];
            if(mid%x[i]==0){
                now--;
            }
            int pos=upper_bound(x.begin(),x.end(),now)-x.begin();
            if(pos>i){
                to+=pos-i-1;
            }
        }
        for(int i=0;i<y.size();i++){
            int now=mid/y[i];
            if(mid%y[i]==0){
                now--;
            }
            int pos=upper_bound(y.begin(),y.end(),now)-y.begin();
            if(pos>i){
                to+=pos-i-1;
            }
        }
    }
    return to<=k-1;
}
signed main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        int a;
        cin>>a;
        if(a>0){
            x.push_back(a);
        }
        else if(a<0){
            y.push_back(a);
        }
        else{
            cnt++;
        }
    }
    sort(x.begin(),x.end());
    sort(y.begin(),y.end());
    int l=(int)(-1e18),r=(int)(1e18),ans;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)){
            l=mid+1;
            ans=mid;
        }
        else{
            r=mid-1;
        }
    }
    cout<<ans;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...