[luogu7340]Balance
构造一个坐标系,共有$n$个黑点和百点,第$i$个黑点为$(p_{i},a_{i})$,第$i$个白点为$(-q_{i},-b_{i})$
考虑第$i$个黑点和第$j$个白点连线的斜率,恰好就是$f(i,j)$
根据$p_{i},q_{i}>0$,注意到黑点一定在白点右侧,且恰好从$y$轴将两者分开
对于$f(i,j)$,若其是所有$f(i,k)$($1\le k\le n$)中第$x$小,这也就等价于存在$x$个白点在第$i$个黑点和第$j$个白点连线的上方(包括线上)且严格在其上方的白点数小于$x$个
(对于这些白点,其与第$i$个黑点的连线斜率一定比第$j$个白点小)
类似地,$f(i,j)$是所有$f(k,j)$($1\le k\le n$)中第$y$小,也就等价于存在$y$个黑点在第$i$个黑点和第$j$个白点连线的下方(包括线上)且严格在其下方的黑点数小于$y$个
从中,可以发现合法性仅与这条直线有关,且当直线确定后,从其上任取一个黑点和白点即为答案
(不难证明若其满足上述条件,则一定存在这样的黑点和白点)
从几何的角度来说,一个点$P$在直线$l$上方,等价于过$P$作与$l$平行的直线后其截距大于$l$的截距(如果允许在直线$l$上即后面变为大于等于)
当确定斜率后,过所有白点作一条该斜率的直线,也就是要找到与$y$轴交点上从上往下第$x$个交点,如果该斜率可行,那么必然是这条直线,然后我们检验另外一个条件即可
斜率是具备单调性的,具体来说,随着斜率的增长,这个截距也一定向上移动,那么直线下的黑点数也单调递增,即单调(特别的,相等时应令$r=mid$)
时间复杂度为$o(n\log n)$(具体实现可以利用nth_element函数),可以通过
(代码会挂掉,大概是因为浮点误差)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define eps 1e-6
5 int t,n,x,y,a[N],b[N],p[N],q[N],id[N];
6 double tmp;
7 bool cmp(int x,int y){
8 return q[x]*tmp-b[x]>q[y]*tmp-b[y];
9 }
10 void read(int &x){
11 int flag=x=0;
12 char c=getchar();
13 while ((c<'0')||(c>'9')){
14 if (c=='-')flag=1;
15 c=getchar();
16 }
17 while ((c>='0')&&(c<='9')){
18 x=x*10+c-'0';
19 c=getchar();
20 }
21 if (flag)x=-x;
22 }
23 int get(double k){
24 tmp=k;
25 for(int i=1;i<=n;i++)id[i]=i;
26 nth_element(id+1,id+x,id+n+1,cmp);
27 return id[x];
28 }
29 int calc(double k){
30 int x0=get(k),ans=0;
31 double c=q[x0]*k-b[x0];
32 for(int i=1;i<=n;i++)
33 if (a[i]-k*p[i]<=c+eps)ans++;
34 return ans;
35 }
36 int main(){
37 read(t);
38 while (t--){
39 read(n),read(x),read(y);
40 for(int i=1;i<=n;i++)read(a[i]),read(b[i]),read(p[i]),read(q[i]);
41 double l=-2e9,r=2e9;
42 while (r-l>eps){
43 double mid=(l+r)/2;
44 if (calc(mid)>=y)r=mid;
45 else l=mid;
46 }
47 l=r;
48 int x0=get(l);
49 for(int i=1;i<=n;i++)
50 if (fabs((a[i]-l*p[i])-(q[x0]*l-b[x0]))<=eps){
51 printf("%d %d\n",i,x0);
52 break;
53 }
54 }
55 }
[luogu7340]Balance的更多相关文章
- Sample a balance dataset from imbalance dataset and save it(从不平衡数据中抽取平衡数据,并保存)
有时我们在实际分类数据挖掘中经常会遇到,类别样本很不均衡,直接使用这种不均衡数据会影响一些模型的分类效果,如logistic regression,SVM等,一种解决办法就是对数据进行均衡采样,这里就 ...
- LB(Load balance)负载均衡集群--{LVS-[NAT+DR]单实例实验+LVS+keeplived实验} 菜鸟入门级
LB(Load balance)负载均衡集群 LVS-[NAT+DR]单实例实验 LVS+keeplived实验 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一 ...
- Balance - 七夕悠然
想争取一个月至少一篇博客的,还是没搭上七月的末班车.两个小妹妹来上海看我了,工作上又有点儿忙,充分利用所有时间了,还是没有挪出时间来写东西,貌似写东西也要时机一样,需要在可以静静思考的时候,再加上有淡 ...
- Java-集合=第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: List list = new ArrayList(); list.add(new A
第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得 ...
- java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...
- UVa 673 Parentheses Balance -SilverN
You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...
- POJ1837 Balance[分组背包]
Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 13717 Accepted: 8616 Descript ...
- UVa 673 Parentheses Balance
一个匹配左右括号的问题 /*UVa 673 Parentheses Balance*/ #include<iostream> #include<algorithm> #incl ...
- A feature in Netsuite Reports > Financial > Balance Sheet
最新版本的Customize balance sheet page Left side > Layout > Add Reference Row Then in right side, y ...
随机推荐
- 高中最后一刻&大学第一课&为人师的责任
文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...
- CSS常见的5种垂直水平居中(面试够用)
方法一 (flex) <div id='box'> <div class='child'></div> </div> #box{ width:200px ...
- WPF实现Win10汉堡菜单
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...
- FastAPI 学习之路(十五)响应状态码
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- 【c++ Prime 学习笔记】第15章 面向对象程序设计
15.1 OOP:概述 面向对象程序设计(object-oriented programming)的核心思想是:数据抽象.继承.动态绑定 使用数据抽象,可将类的接口与实现分离 使用继承,可定义相似的类 ...
- 【二食堂】Beta - 测试报告
Beta - 测试报告 测试过程中发现的bug Beta阶段的新bug 我们在Beta阶段的开发过程中就进行了测试,发现了许多bug.这其中后端的bug比较多,在这里我列举一些比较重要的功能性bug. ...
- 第五次Alpha Scrum Meeting
本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...
- UltraSoft - Beta - Scrum Meeting 10
Date: May 26th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 暂无 Kkkk 前端 前端增加了 ...
- [软工顶级理解组] Alpha阶段测试报告
[软工顶级理解组] Alpha阶段测试报告 在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原 ...
- 扩展spring data jpa的repository
在我们编写代码的过程中,spring data jpa为我们的持久层提供的极大的方便,但有时spring data jpa提供的repository并不能完全满足我们开发的需求,因此就需要进行扩展.s ...