Luogu P4479 [BJWC2018]第k大斜率
一道清真简单的好写的题
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大斜率相关推荐
- [BJWC2018]第k大斜率
题目链接:[BJWC2018]第k大斜率 显然可以二分答案,然后找大于当前答案的斜率个数. 怎么判断呢? 假设当前斜率为k,则:(yi-yj) / (xi-xj) > k 假设xi>xj ...
- 查找无序数组中第K大的数
思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...
- C++的STL 堆 实现获取数组堆第K大的数
前言 堆数据结构 使用的是优先级队列实现,创建堆的时候需要指定堆中元素的排列方式,即最大堆或者最小堆 最大堆即 堆顶元素为堆中最大的元素 最小堆即 堆顶元素为堆中最小堆元素 如下为一个最大堆 回到文章 ...
- c语言判断数组里的数据先递增后递减,查找两个有序序数组(一个递增、一个递减)中第K大的数...
题目不难,关键是边界条件要想清楚.先写一个时间复杂度为O(K) 的解法. #include using namespace std; //a[] increase //b[] decrease //u ...
- ACdream 1099——瑶瑶的第K大——————【快排舍半,输入外挂】
瑶瑶的第K大 Time Limit:2000MS Memory Limit:128000KB 64bit IO Format:%lld & %llu Submit Status ...
- 面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...
- 可持久化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 ...
- 主席树 ---- LCA(树上第k大)Count on a tree
题目链接:https://www.spoj.com/problems/COT/en/ 题意: 给你一颗树,问你u,v结点这条路径上第k大是多少. 思路:就是说先将无根树转化为有根树,然后对每一条链建立 ...
- 第k大 or 第k小 or 中位数
c++里面有模板,这里不赘述.主要是c语言实现. 主要思想是递归+快排 1.用一个数组,进行原址选择,缺点是只能进行一次. 将一个数组以某一个元素a作为基准(这里选取最后一个),将这个数组划分,使得左 ...
最新文章
- 屏幕旋转的处理方法,实现视图位置的变化
- 2020年下信息系统项目管理师合格分数线通知
- 我的Go语言学习之旅六:做一个WIN的简单弹窗
- html action能跨域么,ASP.NET MVC 中设置跨域
- mysql索引动态维护_MySQL之——索引
- 如何增加虚拟机ubuntu的硬盘
- Java pdf图书下载网站整理
- IEEE Transactions on Industrial Informatics(TII)投稿指导
- pycharm项目里的根目录
- Horizontally Visible Segments
- PHP的抽象类和抽象方法 abstract
- 华为鸿蒙新闻短评,科技圈“某高管”发表对华为鸿蒙的看法,遭网友回怼
- R语言 去掉NA求均值
- linux编程拼图游戏,cocos2d-x制作拼图游戏
- 物联网实训室建设方案
- hdu 多校赛 第三场
- tp5.1 前台模板使用公共模板网页(header.html、foot.html、base.html)
- 中文java_java中文编程
- android base64转pdf文件的展示
- 分享一款开源的百度云网盘下载工具,轻量,方便~