正题

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


题目大意

给出nnn个点,求所有点对构成的直线中与原点距离第kkk小的距离

2≤n≤105,1≤k≤n(n−1)22\leq n\leq 10^5,1\leq k\leq \frac{n(n-1)}{2}2≤n≤105,1≤k≤2n(n−1)​


解题思路

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

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

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

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

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

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

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

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


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. POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。

    题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...

  2. VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分

    http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...

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

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

  4. 树状数组 + 二分 - Query HDU - 4339

    树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...

  5. POJ 2182 Lost Cows [树状数组+二分]

    Description N (2 <= N <= 8,000) cows have unique brands in the range 1..N. In a spectacular di ...

  6. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  7. D. Multiset(树状数组 + 二分)

    Multiset 可能更好的阅读体验 思路 二分 + 树状数组做法 我们发现每个数的范围是$ <= 1e6$的,所以可以直接在线操作,不用离散化离线操作. 这个时候我们的treetreetree ...

  8. CF1404C:Fixed Point Removal(离线)(树状数组二分)

    解析 写了不少线段树上二分,原来树状数组上也是可以二分的 首先如果ai>ia_i>iai​>i,那必然无法删除,下面只考虑ai<=ia_i<=iai​<=i的情况 ...

  9. P6619-[省选联考2020A/B卷]冰火战士【树状数组二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P6619 题目大意 有火系战士和冰系战士有一个温度和一个战斗力,每次加入或删除一个战士,要求一个最大的kkk使得温度 ...

最新文章

  1. css menu builder,AutoPlay Menu Builder使用教程【图文教程】
  2. mysql经纬度转距离_Mysql 拿指定经纬度与数据库多条经纬度进行距离计算 (转)
  3. php-fpm定义成集群资源时报错解决方法
  4. [ CodeVS冲杯之路 ] P1044
  5. Microsoft Agrees to Acquire ProClarity
  6. 商汤三体梦幻联动,能遭遇水滴的那种元宇宙要来了!我在现场听见了次元壁破碎的声音...
  7. Mozilla 准备让“合格” Linux 用户测试 WebRender
  8. 组合数学--约瑟夫环问题 Josephus
  9. 你的食物变质没?用AI算法来检测一下吧
  10. 60秒计时器的仿真电路_DS1302的电子万年历,时间、闹钟可调,带温度农历显示,原理图、仿真和代码...
  11. Vue学习笔记(一)—— 常用特性
  12. 蓝桥杯 ALGO-72 算法训练 成绩的等级输出
  13. mysql res.body_请帮我找一下错吧:body ?php $link=mysql_connect('localhost','root','123') or die (不能连接数据库...
  14. Qt 70行代码实现控件任意拆分 选中控件水平垂直拆分 窗口分割
  15. vue 实现简约留言板
  16. ideaIU-2018.3.1安装及激活方法-百度网盘分享
  17. c#加密:二、散列法 MD5、SHA256、SHA512
  18. 【转】加油站压力/真空阀(PV阀)的工作原理及安全注意事项
  19. Chrome谷歌浏览器无法调用摄像头原因及解决办法
  20. 华为eNSP的介绍与简单使用

热门文章

  1. php生成vcf,详解PHP如何实现生成vcf vcard文件
  2. python循环语句嵌套_Python 循环语句
  3. lua loadstring传递参数_lua学习之函数篇
  4. android vcard解析代码,Android使用vcard文件的方法简单实例
  5. 为什么mysql与eclipse_mysql的用户名和密码都是正确的,但是eclipse启动说不对
  6. vs code python 插件_工具篇-vscode效率提升插件
  7. python中x_python中round(x,[n])的使用
  8. php代码里加图片,php如何添加图片
  9. linux yum自动挂载_LINUX6安装YUM仓库和实现开机自动挂载
  10. java实用教程——组件及事件处理——DocumentEvent事件