java正则表达式取整,ABC155 D pair 边界处理取整(示例代码)

ABC155 D pair 取整坑点

思路

很常见的一道题,二分找答案,然后看这个答案排rank?,排rank?用二分继续找一遍二分套二分即可,就是边界比较烦,老年人写的心情烦躁

老年人被取整坑的几天。这题其实以前写过,以前被坑过,然后这次又被坑了一次,不愧是我。。。

1.ceil和floor一个是接近无穷大,另外一个是接近无穷小取

2.直接两个int除 是向0取整 int(-1/2)=-1 int(-4/3)=-1也就是负数的时候和人正常的向下取整逻辑不一样,逻辑上认为是向小了取,而事实是向0取

3.如果n>=m>0向上取整建议(n-1)/m+1

4.负数的时候推荐使用ceil 除非精度要求特别高 否则一般不会翻车

#include

using namespace std;

#define pb push_back

#define F first

#define S second

#define mkp make_pair

#define pii pair

typedef long long ll;

const int maxn=2e5+5;

const int mod=1e9+7;

ll n,k,ling;

ll a[maxn];

bool check(ll x){

ll cnt=0;

for(int i=0;i

if(a[i]==0){

if(x>=0)cnt+=n-1;

continue;

}

else if(a[i]<0){

ll tmp=0;

if(x>=0)tmp=x/a[i];//a[i]*tmp<=x

else {

if(x%a[i]==0)tmp=x/a[i];

else tmp=x/a[i]+1;

}

cnt+=n-(lower_bound(a,a+n,tmp)-a);

}

else if(a[i]>0){

ll tmp=0;

if(x>=0)tmp=x/a[i];

else{

if(x%a[i]==0)tmp=x/a[i];

else tmp=x/a[i]-1;

}

cnt+=upper_bound(a,a+n,tmp)-a;

}

if(a[i]*a[i]<=x)cnt--;

//cout<

}

return cnt/2>=k;

}

int main(){

scanf("%lld%lld",&n,&k);

for(int i=0;i

scanf("%lld",&a[i]);

}

sort(a,a+n);

ll l=-1e18,r=1e18,ans=0;

while(l<=r){

ll mid=(l+r)/2;

if(check(mid))r=mid-1,ans=mid;

else l=mid+1;

}

//check(-6);

cout<

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值