正题

题目链接:https://www.luogu.com.cn/problem/CF1446F


题目大意

给出\(n\)个点,求所有点对构成的直线中与原点距离第\(k\)小的距离

\(2\leq n\leq 10^5,1\leq k\leq \frac{n(n-1)}{2}\)


解题思路

二分还是挺显然的,考虑二分了之后怎么判断一个距离以内的直线数量

两个点对之间的直线在原点距离\(d\)以内,也就是这条直线经过原点为中心半径为\(d\)的圆。换一种理解,也就是如果有这个圆那么这两个点对之间无法相互看见。

现在问题变为了求有多少个点对之间无法相互看见,给张官方题解的图片就挺容易理解的



也就是说我们对于每个点找到它与圆的两个切点之间在圆上构成的一个区间。

如果两个点的区间有交集那么他们就可以相互看见。

现在问题就变为了求有多少对区间有交。

这个直接用树状数组统计就好了。

环的话直接断开,跨越了环的就取反。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define lowbit(x) (x&-x)
using namespace std;
const ll N=2e5+10;
double eps=1e-8,Pi=acos(-1);
ll n,k,cnt,m,t[N],p[N],l[N],r[N];
double a[N],b[N],c[N],L[N],R[N];
bool v[N];
void Change(ll x,ll val){
while(x<=cnt){
t[x]+=val;
x+=lowbit(x);
}
return;
}
ll Ask(ll x){
ll ans=0;
while(x){
ans+=t[x];
x-=lowbit(x);
}
return ans;
}
bool cmp(ll x,ll y)
{return l[x]<l[y];}
ll check(double d){
cnt=0;m=0;
for(ll i=1;i<=n;i++)v[i]=0;
for(ll i=1;i<=n;i++){
double dis=sqrt(a[i]*a[i]+b[i]*b[i]);
if(dis-d<eps){v[i]=1;continue;}
double ang=atan2(b[i],a[i]),ta=acos(d/dis);
L[i]=ang-ta;R[i]=ang+ta;
if(L[i]<-Pi)L[i]+=2*Pi;
if(R[i]>Pi)R[i]-=2*Pi;
if(L[i]>R[i])swap(L[i],R[i]);
c[++cnt]=L[i];c[++cnt]=R[i];
}
sort(c+1,c+1+cnt);
for(ll i=1;i<=n;i++){
if(v[i])continue;p[++m]=i;
l[i]=lower_bound(c+1,c+1+cnt,L[i])-c;
r[i]=lower_bound(c+1,c+1+cnt,R[i])-c;
}
memset(t,0,sizeof(t));
sort(p+1,p+1+m,cmp);
ll ans=n*(n-1)/2;
for(ll i=1;i<=m;i++){
ll x=p[i];
ans-=Ask(r[x])-Ask(l[x]-1);
Change(r[x],1);
}
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&k);
for(ll i=1;i<=n;i++)
scanf("%lf%lf",&a[i],&b[i]);
double l=0,r=20000;
while(r-l>=eps){
double mid=(l+r)/2.0;
if(check(mid)<k)l=mid;
else r=mid;
}
printf("%.10lf",l);
return 0;
}

CF1446F-Line Distance【计算几何,树状数组,二分】的更多相关文章

  1. POJ 2182 Lost Cows 【树状数组+二分】

    题目链接:http://poj.org/problem?id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  2. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  3. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

  4. 树状数组+二分||线段树 HDOJ 5493 Queue

    题目传送门 题意:已知每个人的独一无二的身高以及排在他前面或者后面比他高的人数,问身高字典序最小的排法 分析:首先对身高从矮到高排序,那么可以知道每个人有多少人的身高比他高,那么取较小值(k[i], ...

  5. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  6. The Stream of Corning 2( 权值线段树/(树状数组+二分) )

    题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...

  7. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  8. ZOJ 3157 Weapon --计算几何+树状数组

    题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...

  9. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

随机推荐

  1. npm常用命令及其node相关工具汇总

    它是一个事件驱动异步I/O单进程的服务端JS环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 浏览器是JS的前端运行环境. Node.js是JS的后端运行环 ...

  2. vue--三种组件中之间的传值

    参考网址:https://www.jianshu.com/p/46573a741c29 一.父子组件之间的传值----props/$emit 组件之间的传值,我们比较常用到的是props/$emit ...

  3. 【springboot】事务处理

    转自: https://blog.csdn.net/cp026la/article/details/86496788 扯淡: 复杂的业务逻辑中一个请求可能需要多次操作数据库,要保证一个Service ...

  4. [SWMM]模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  5. Hibernate之检索方式

    时间:2017-1-22 16:09 --检索方式Hibernate中提供了以下几种检索对象的方式:    *   导航对象图检索方式        根据已经加载额对象导航到其他对象.        ...

  6. Promise.race()

    Promise.race([ ])---race竞赛,只要有一个决议了,就返回一个promise实例(对应resolve()或reject( )中参数值: 1.与Promise.all()对应的,还有 ...

  7. mysql8.0----mysqldump抛出:Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

    问题:我尝试使用mysqldump时,得到以下错误: 复制 $> mysqldump --single-transaction --h  -u user -p db > db.sql my ...

  8. Windows内核基础知识-8-监听进程、线程和模块

    Windows内核基础知识-8-监听进程.线程和模块 Windows内核有一种强大的机制,可以在重大事件发送时得到通知,比如这里的进程.线程和模块加载通知. 本次采用链表+自动快速互斥体来实现内核的主 ...

  9. sublime text 3 中文排序插件

    ST3 的排序不支持中文按拼音排序,所以需要搞一个插件来支持这一特性 pypinyin 这个库可以把中文转成拼音,可惜不支持 python3.3,而 ST3 内置的 python 就是 3.3 我系统 ...

  10. vue ele table表格 设置只能勾选一个

    table 更改属性设置: <el-table ref="multipleTable" :data="tableData" tooltip-effect= ...