这里会显示出您选择的修订版和当前版本之间的差别。
|
2020-2021:teams:wangzai_milk:d._pairs [2020/05/17 11:58] zars19 创建 |
2020-2021:teams:wangzai_milk:d._pairs [2020/05/17 16:48] (当前版本) zars19 |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| <code cpp> | <code cpp> | ||
| + | #include<cstdio> | ||
| + | #include<cassert> | ||
| + | #include<iostream> | ||
| + | #include<algorithm> | ||
| + | #include<vector> | ||
| + | #define pb push_back | ||
| + | using namespace std; | ||
| + | typedef long long LL; | ||
| + | const int N=2e5+5; | ||
| + | const LL INF=1e18; | ||
| + | vector<LL>pos,neg; | ||
| + | int main() | ||
| + | { | ||
| + | int n; | ||
| + | LL k; | ||
| + | scanf("%d%lld",&n,&k); | ||
| + | for(int i=1;i<=n;i++) | ||
| + | { | ||
| + | int a; | ||
| + | scanf("%d",&a); | ||
| + | if(a>0)pos.pb(a); | ||
| + | else if(a<0)neg.pb(a); | ||
| + | } | ||
| + | sort(pos.begin(),pos.end()); | ||
| + | sort(neg.begin(),neg.end()); | ||
| + | LL ne=1LL*neg.size()*pos.size(); | ||
| + | LL po=1LL*pos.size()*(pos.size()-1)/2+1LL*neg.size()*(neg.size()-1)/2; | ||
| + | LL ze=1LL*n*(n-1)/2-ne-po; | ||
| + | if(k<=ne) | ||
| + | { | ||
| + | LL l=-INF,r=0,ans; | ||
| + | while(l<=r) | ||
| + | { | ||
| + | LL mid=(l+r)/2,num=0; | ||
| + | for(int i=0;i<neg.size();i++) | ||
| + | { | ||
| + | LL t=mid%neg[i]?mid/neg[i]+1:mid/neg[i]; | ||
| + | int x=lower_bound(pos.begin(),pos.end(),t)-pos.begin(); | ||
| + | num+=pos.size()-x; | ||
| + | } | ||
| + | if(num<k)l=mid+1; | ||
| + | else r=mid-1,ans=mid; | ||
| + | } | ||
| + | cout<<ans; | ||
| + | } | ||
| + | else if(k<=ne+ze)puts("0"); | ||
| + | else | ||
| + | { | ||
| + | LL l=0,r=INF,ans; | ||
| + | while(l<=r) | ||
| + | { | ||
| + | LL mid=(l+r)/2,num=0; | ||
| + | for(int i=0;i<pos.size();i++) | ||
| + | { | ||
| + | if(pos[i]*pos[i]<=mid)num--; | ||
| + | LL t=mid/pos[i]; | ||
| + | int x=lower_bound(pos.begin(),pos.end(),t+1)-pos.begin(); | ||
| + | if(x)assert(pos[x-1]*pos[i]<=mid); | ||
| + | if(x<pos.size())assert(pos[x]*pos[i]>mid); | ||
| + | num+=x; | ||
| + | } | ||
| + | for(int i=0;i<neg.size();i++) | ||
| + | { | ||
| + | if(neg[i]*neg[i]<=mid)num--; | ||
| + | LL t=mid/neg[i]; | ||
| + | int x=lower_bound(neg.begin(),neg.end(),t)-neg.begin(); | ||
| + | assert(neg[x]*neg[i]<=mid); | ||
| + | if(x)assert(neg[x-1]*neg[i]>mid); | ||
| + | num+=neg.size()-x; | ||
| + | } | ||
| + | assert(num%2==0); | ||
| + | num=num/2+ze+ne; | ||
| + | if(num<k)l=mid+1; | ||
| + | else r=mid-1,ans=mid; | ||
| + | } | ||
| + | cout<<ans; | ||
| + | } | ||
| + | return 0; | ||
| + | } | ||
| </code> | </code> | ||