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 ...
随机推荐
- css揭秘 一
当某些值相互依赖是,应该把它们的相互关系用代码表达出来 font-size: 20px; line-height: 1.5; // 行高是字体的1.5倍 当改变某个参数时候,做到只改尽量少的地方,最好 ...
- 2019kali中文乱码
1.安装KALI2019.4版本后会出现乱码问题 2.更新国内源,使用vim编辑器修改:vim /etc/apt/sources.list添加 #清华大学 [更新源] deb https://m ...
- C语言 switch
C语言 switch 功能:获取到值对应成立不同表达式. 优点:switch 语句执行效率比if语句要快,switch是通过开关选择的方式执行,而if语句是从开头判断到结尾. 缺点:不能判断多个区间. ...
- VS打包程序步骤
1.下载打包的程序 2.在你的程序里面安装打包的项目 3.添加项目输出 4.为项目添加必要的文件 双击前面建立好的主输出 一般文件为一些配置文件(如使用Nlog写日志,需要添加Nlog的配置文件)和图 ...
- LRU算法实现 最近最久未使用
1.LRU算法实现 最近最久未使用(蚂蚁金服笔试题,本人亲自经历的[苦笑.jpg]) 实现原理:数组 主要功能:初始化.入队列 主要操作:数组元素移动 代码: package com.ch.evalu ...
- 初入python
初入python 一定要学好python 求1-100的和: i=1 s=0 while i<101: s=s+i i=i+1 print(s)
- jQuery---清空节点和删除节点
清空节点和删除节点 //可以清空一个元素的内容 //清理门户 $("div").empty(); //完全移除元素 $("div").remove(); $(f ...
- 使用Image Sharp 对二维码图片中间加入logo图片
1.在NuGet包源加入Image Sharp包源 2.在需要用到Image Sharp的项目中安装以下的插件 3.调用图片上绘制图片的方法
- 3ds Max File Format (Part 5: How it all links together; ReferenceMaker, INode)
At this point, you should start to familiarize yourself a bit with the publicly available 3ds Max AP ...
- python:创建文件夹
#!/usr/bin/python# -*- coding:utf-8 -*- import os dir = './dir'os.mkdir(dir)