Atcoder Beginner Contest 155D(二分,尺取法,细节模拟)
二分,尺取法,细节模拟,尤其是要注意a[i]被计算到和a[i]成对的a[j]里时
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
long long a[];
int n;
long long k;
bool check(long long x){
long long sum=;//比x小的个数
for(int i=;i<=n;++i){
if(a[i]!=){
long long flag=x/a[i];
if(x%a[i]){
if(x>&&a[i]<){//x=5,a[i]=-2,flag=-2
sum+=n+-(lower_bound(a+,a++n,flag)-a);//[-2,∞)
if(a[i]>=flag)//如果a[i]也在上面sum加过的范围内
--sum;//去掉a[i]自己,自己不能和自己成对
}
else if(x>&&a[i]>){//x=5,a[i]=2,flag=2,flag+1=3
sum+=(lower_bound(a+,a++n,flag+)-a)-;//[2,∞)
if(a[i]<=flag)//如果a[i]也在上面sum加过的范围内
--sum;//去掉a[i]自己,自己不能和自己成对
}
else if(x<&&a[i]<)//和以上类似
sum+=n+-(upper_bound(a+,a++n,flag)-a);
else if(x<&&a[i]>)
sum+=(lower_bound(a+,a++n,flag)-a)-;
}
else{
if(x>&&a[i]<){
sum+=n+-(upper_bound(a+,a++n,flag)-a);
if(a[i]>flag)
--sum;
}
else if(x>&&a[i]>){
sum+=(lower_bound(a+,a++n,flag)-a)-;
if(a[i]<flag)
--sum;
}
else if(x<&&a[i]<)
sum+=n+-(upper_bound(a+,a++n,flag)-a);
else if(x<&&a[i]>)
sum+=(lower_bound(a+,a++n,flag)-a)-;
else if(x==&&a[i]<)
sum+=n+-(upper_bound(a+,a++n,)-a);
else if(x==&&a[i]>)
sum+=(lower_bound(a+,a++n,)-a)-;
}
}
else if(a[i]==&&x>)
sum+=n-;
}
sum>>=;//除以二,同一对被计算了两次
return sum<k;//如果比x小的不到k个,那么答案还会更大
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>k;
for(int i=;i<=n;++i)
cin>>a[i];
sort(a+,a++n);
long long l=-1e18,r=1e18;
long long ans=;
while(l<=r){
long long mid=(l+r)>>;
if(check(mid)){//此时比mid小的不到k个,答案可能可以更大,正确答案是比mid小的正好是k-1个
ans=mid;
l=mid+;
}
else
r=mid-;
}
cout<<ans;
return ;
}
Atcoder Beginner Contest 155D(二分,尺取法,细节模拟)的更多相关文章
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 260 (D-E)
AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
随机推荐
- scikit-learn包学习笔记1
dataset 在scikit-learn包自带的数据集,R包也自带数据集iris鸢尾花数据集,做训练集.特征较少. from sklearn import datasets # Import nec ...
- Luogu2577 | [ZJOI2005]午餐 (贪心+DP)
题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行 \(N\) 人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他 ...
- JZOJ5988 珂学计树题
题意 liu_runda曾经是个喜欢切数数题的OIer,往往看到数数题他就开始刚数数题.于是liu_runda出了一个数树题.听说OI圈子珂学盛行,他就在题目名字里加了珂学二字.一开始liu_rund ...
- 树莓派查看ip地址(命令ifconfig)和退出ping
1.1树莓派查看ip地址用如下命令: ifconfig -a 结果如下图所示: 注意:树莓派查看ip地址是用命令ifconfig,而Windows的cmd命令查看ip地址是ipconfig.
- HTML5,从零开始
一.网页的组成部分 <!DOCTYPE html> <html> <head> <title>这是标题</title> <meta c ...
- window服务session隔离
在window服务中抓取窗体是做不到的,因为window系统的session隔离机制:如果想要调用外部程序,可以通过 创建代理进程 进行操作(通过非托管代码CreateProcessAsUser函数进 ...
- 替换 MyEclipse 中已有的项目
一.删除 tomcat 中的项目 1.停止 tomcat 2.删除 tomcat 中的项目 选中项目,然后右键 - Remove deployment,这个可能需要一点时间 二.删除 MyEclips ...
- vue必须掌握之组件通信(7种方法)
方法一:$emit / props 父组件通过props的方式向子组件传递,子组件通过$emit触发父组件中v-on绑定的自定义事件 <!--父组件--> <template> ...
- jQuery---prop方法和表格全选案例
prop方法和表格全选案例 对于布尔类型的属性,不用attr方法,应该用prop方法 prop用法跟attr方法一样 <input type="button" value=& ...
- Aspx Ajax 调用 C#函数处理数据
jquery ajax 调用后台函数 var res; $.ajax({ type: "POST", url: "fast_index_overview.aspx/Get ...