一道清真简单的好写的题

Luogu P4479


题意

求点集两两连出的直线中斜率第$ k$大的直线


$ Solution$

二分答案,设$x_j \geq x_i$

若点$ (x_i,y_i)$和点$(x_j,y_j)$构成的斜率大于二分的答案$ k$则有

$ \frac{y_j-y_i}{x_j-x_i} \geq k$

$y_j-k·x_j \geq y_i-k·x_i$

转化成二维偏序

树状数组/归并排序维护即可

注意特判各种边界问题

时间复杂度$ O(n \log^2 n)$


$ my \ code$

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define rt register int
#define ll long long
using namespace std;
inline ll read(){ll x = 0; char zf = 1; char ch = getchar();while (ch != '-' && !isdigit(ch)) ch = getchar();if (ch == '-') zf = -1, ch = getchar();while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf;
}
void write(ll y){if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}
void writeln(const ll y){write(y);putchar('\n');}
ll n,m;
struct node{int x,y;bool operator <(const node s)const{if(x==s.x)return y>s.y;return x<s.x;}
}a[100010];
ll q[100010],zs[100010],ans;
ll calc(int L,int R){if(L==R)return 0;if(ans>=m)return ans;const int mid=L+R>>1;calc(L,mid);calc(mid+1,R);if(ans>=m)return ans;for(rt i=mid+1,j=L;i<=R;i++){while(j<=mid&&q[j]<=q[i])j++;ans+=j-L;}int tot1=L,tot2=mid+1,pl=L;while(tot1<=mid||tot2<=R){if(tot1>mid||(q[tot1]>q[tot2]&&tot2<=R))zs[pl++]=q[tot2++];else zs[pl++]=q[tot1++];}for(rt i=L;i<=R;i++)q[i]=zs[i];return ans;
}
bool check(int x){ans=0;for(rt i=1;i<=n;i++)q[i]=(ll)a[i].y-(ll)x*a[i].x;return (calc(1,n)>=m);
}
int main(){n=read();m=read();for(rt i=1;i<=n;i++)a[i].x=read(),a[i].y=read();sort(a+1,a+n+1);int L=-200000000,R=200000000;while(L<=R){const int mid=L+R>>1;if(check(mid))L=mid+1;else R=mid-1;}write(R);return 0;
}

转载于:https://www.cnblogs.com/DreamlessDreams/p/10083396.html

Luogu P4479 [BJWC2018]第k大斜率相关推荐

  1. [BJWC2018]第k大斜率

    题目链接:[BJWC2018]第k大斜率 显然可以二分答案,然后找大于当前答案的斜率个数. 怎么判断呢? 假设当前斜率为k,则:(yi-yj) / (xi-xj) > k 假设xi>xj ...

  2. 查找无序数组中第K大的数

    思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...

  3. C++的STL 堆 实现获取数组堆第K大的数

    前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...

  4. c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...

    题目不难,关键是边界条件要想清楚.先写一个时间复杂度为O(K) 的解法. #include using namespace std; //a[] increase //b[] decrease //u ...

  5. ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】

    瑶瑶的第K大 Time Limit:2000MS     Memory Limit:128000KB     64bit IO Format:%lld & %llu Submit Status ...

  6. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  7. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  8. 主席树 ---- LCA(树上第k大)Count on a tree

    题目链接:https://www.spoj.com/problems/COT/en/ 题意: 给你一颗树,问你u,v结点这条路径上第k大是多少. 思路:就是说先将无根树转化为有根树,然后对每一条链建立 ...

  9. 第k大 or 第k小 or 中位数

    c++里面有模板,这里不赘述.主要是c语言实现. 主要思想是递归+快排 1.用一个数组,进行原址选择,缺点是只能进行一次. 将一个数组以某一个元素a作为基准(这里选取最后一个),将这个数组划分,使得左 ...

最新文章

  1. 屏幕旋转的处理方法,实现视图位置的变化
  2. 2020年下信息系统项目管理师合格分数线通知
  3. 我的Go语言学习之旅六:做一个WIN的简单弹窗
  4. html action能跨域么,ASP.NET MVC 中设置跨域
  5. mysql索引动态维护_MySQL之——索引
  6. 如何增加虚拟机ubuntu的硬盘
  7. Java pdf图书下载网站整理
  8. IEEE Transactions on Industrial Informatics(TII)投稿指导
  9. pycharm项目里的根目录
  10. Horizontally Visible Segments
  11. PHP的抽象类和抽象方法 abstract
  12. 华为鸿蒙新闻短评,科技圈“某高管”发表对华为鸿蒙的看法,遭网友回怼
  13. R语言 去掉NA求均值
  14. linux编程拼图游戏,cocos2d-x制作拼图游戏
  15. 物联网实训室建设方案
  16. hdu 多校赛 第三场
  17. tp5.1 前台模板使用公共模板网页(header.html、foot.html、base.html)
  18. 中文java_java中文编程
  19. android base64转pdf文件的展示
  20. 分享一款开源的百度云网盘下载工具,轻量,方便~

热门文章

  1. CCommandLineInfo类
  2. C#中的Partial
  3. Tomcat 启动卡住
  4. 使用TinySpider实战抓取自己博客中的内容
  5. Nginx配置和内核优化 实现突破十万并发
  6. CISCO路由器TELNET和SSH远程登录配置实例
  7. 通过rsync+inotify实现数据的实时备份
  8. 行业观察(一)| 从渠道为王到数据为王——浅谈服装零售企业的数字化转型...
  9. Android自定义视图四:定制onMeasure强制显示为方形
  10. 冰点文库下载器停止工作解决办法