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 ...
随机推荐
- cocos studio 中交互性
cocos studio 属性->常规->交互性,勾选之后相当于代码中的setTouchEnabled(true)
- Centos 安装SVN
Centos 安装SVN centos(我这里使用的是CentOS7)下yum命令即可方便的完成安装 $ sudo yum install subversion 测试安装是否成功: $ svnser ...
- PAT (Basic Level) Practice (中文)1064 朋友数 (20 分) (set)
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”.例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号.给定 ...
- python3练习100题——044
41-43讲关于python的变量范围,没有什么别的内容,我删除了. 原题链接:http://www.runoob.com/python/python-exercise-example44.html ...
- 841. 字符串哈希(hash)
给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2l1,r1,l2,r2,请你判断[l1,r1l1,r1]和[l2,r2l2,r2]这两个区间所包含的字符串子串是否完 ...
- python语言基础3
一:python函数 是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块.以前使用过的一些Python提供的内建函数,如print().max(4,18).min(100,50).当然我们自 ...
- Cow Contest POJ - 3660 floyd传递闭包
#include<iostream> #include<cstring> using namespace std; ,INF=0x3f3f3f3f; int f[N][N]; ...
- 菜不成声 的 ac自动机 刷题记录
HDU2222 Keywords Search 模板题.数组开小了结果会T... 代码 #include <bits/stdc++.h> #define nmax 10010 using ...
- ajax从jsp向servlet传值
function Delete(s){ xmlHttp=new XMLHttpRequest(); var url = "/emp/FindSpecial?selcol=" +s; ...
- jacob导入项目
在 resource 下创建一个 lib 将网上下载的 jacob.jar 放入其中 在 pom 文件中导入相对应的 jar 包 <dependency> <groupId>c ...