AtCoder 294F 二分套二分

news/2024/12/5 5:47:41/

题意:

两个人分别有nnnmmm杯糖水,第一个人的第iii杯有a[i]a[i]a[i]克糖,b[i]b[i]b[i]克水,第二个人的第iii杯有c[i]c[i]c[i]克糖,d[i]d[i]d[i]克水。现在从两个人手中各取一杯糖水混合,有nmnmnm种可能的情况,求出其中浓度第kkk大的那一杯的浓度

Solution:

不妨先考虑这样一个问题:

两个数组各取一个元素,乘积有nmnmnm种,求出其中第kkk大的结果

直接二分答案,检查二分的答案在所有的情况排名第几,即有多少(i,j)(i,j)(i,j)
a[i]∗b[j]>mida[i]*b[j]>mid a[i]b[j]>mid
只需要固定iii,二分符合这个iiijjj的数量即可,单次check的时间复杂度是O(nlogn)O(nlogn)O(nlogn)

这样只需要找到最后一个排名为kkk的数即可,总复杂度O(nlognlogr)O(nlognlogr)O(nlognlogr)rrr是二分答案的长度

按照上述的思路,我们不妨也考虑二分答案

只需要找到有多少(i,j)(i,j)(i,j)
a[i]+c[j]a[i]+b[i]+c[j]+d[j]>mid\frac{a[i]+c[j]}{a[i]+b[i]+c[j]+d[j]}>mid a[i]+b[i]+c[j]+d[j]a[i]+c[j]>mid
注意对一杯糖水并不是加浓度更高的糖水浓度就一定更高

此时把(2)(2)(2)改写成:
a[i]+c[j]>mid(a[i]+b[i]+c[j]+d[j])×mida[i]+c[j]>mid(a[i]+b[i]+c[j]+d[j])\times mid a[i]+c[j]>mid(a[i]+b[i]+c[j]+d[j])×mid
下标分类,有
(1−mid)×a[i]−mid×b[i]>(mid−1)×c[j]+mid×d[j](1-mid)\times a[i]-mid\times b[i]>(mid-1)\times c[j]+mid\times d[j] (1mid)×a[i]mid×b[i]>(mid1)×c[j]+mid×d[j]
每次check只需要预先计算右式,排序后枚举iii在右式上二分即可了

#include<iostream>
#include<utility>
#include<vector>
#include<cstdlib>
#include<numeric>
#include<unistd.h>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<set>
#include<map>
#include<stack>
#include<utility>
#include<cctype>
#include<cassert>
#include<thread>
#include<future>
#include<bitset>
#include<thread>
#include<random>
using namespace std;using ll=long long;
const int N=5e4+5,inf=0x3fffffff;
const long long INF=0x3fffffffffffffff,mod=1e9+7;#define double long doublestruct sugar {int m1,m2;
}a[N],b[N];int n,m,k;
const double eps=1e-19;int cmp(double x,double y) {if(fabs(x-y)<eps) return 0;return x-y>eps?1:-1;
}double val[N];int get_rank(double p) {for(int i=1;i<=m;i++) val[i]=(p-1)*b[i].m1+p*b[i].m2;sort(val+1,val+1+m);int ret=0;for(int i=1;i<=n;i++) {double value=(1-p)*a[i].m1-p*a[i].m2;int it=lower_bound(val+1,val+1+m,value)-val;ret+=it-1;}return ret+1;
}int main() {#ifdef stdjudgefreopen("in.txt","r",stdin);auto TimeFlagFirst=clock();#endifstd::ios::sync_with_stdio(false);std::cin.tie(nullptr);cin>>n>>m>>k;for(int i=1;i<=n;i++) {cin>>a[i].m1>>a[i].m2;}for(int i=1;i<=m;i++) {cin>>b[i].m1>>b[i].m2;}double l=0,r=1,ans=0;for(int i=1;i<=200;i++) {double mid=(l+r)/2;if(get_rank(mid)<=k) {ans=mid;r=mid;} else l=mid;}printf("%.15Lf",100*ans);#ifdef stdjudgefreopen("CON","r",stdin);std::cout<<std::endl<<"耗时:"<<std::clock()-TimeFlagFirst<<"ms"<<std::endl;std::cout<<std::flush;system("pause");#endifreturn 0;
}

http://www.ppmy.cn/news/37785.html

相关文章

三方对接「心得」与「体会」

和三方的关系要处好&#xff1b; 01如果你看到这个话题&#xff0c;并不知道是什么意思&#xff0c;那么祝贺你&#xff0c;安安静静的当个小码农也挺好&#xff1b; 不过我敢说&#xff0c;随着职业生涯的慢慢发展&#xff0c;大家都得碰到&#xff0c;到时候就细细体会吧&am…

入职时,公司要求自己带电脑,每月给100元补贴,如果不接受就不能入职!

为了节约成本&#xff0c;公司能做出什么事&#xff1f;一位网友遇到了这样的事&#xff1a;入职时&#xff0c;公司要求自己带电脑&#xff0c;每个月给100元补贴&#xff0c;如果不接受就得放弃入职&#xff0c;这样的公司有没有坑&#xff1f;有人问&#xff1a;连基本的公司…

java项目开发之接口优化方案

接口优化方案 接口优化可以从如下方案入手 1、批量操作、异步、并行思想、空间换时间、池化思想&#xff0c;sql优化等 1. 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); }优化后&a…

SpringBoot整合Oauth2开放平台接口授权案例

<!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId>&l…

【面试】互联网相关面试题

文章目录问题一&#xff1a;请简单做下自我介绍问题二&#xff1a;你对加班的看法&你能接受加班吗&#xff1f;问题三&#xff1a;你还有什么要问的吗&#xff1f;问题四&#xff1a;说说你最大的优点&缺点问题五&#xff1a;你对薪资有什么要求&#xff1f;问题六&…

蓝桥杯真题4

[蓝桥杯 2017 省 AB] 分巧克力 题目描述 儿童节那天有 KKK 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 NNN 块巧克力&#xff0c;其中第 iii 块是 HiWiH_i \times W_iHi​Wi​ 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 NN…

【新2023Q2模拟题JAVA】华为OD机试 - 找数字 or 找等值元素

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:找数字 or 找等值元素 题目 …

动态sql

当使用了Param注解&#xff0c;要出现指定的参数名当没有使用Param注解&#xff0c;要出现param1&#xff0c;param2当使用了POJO&#xff0c;那么test中出现的是POJO类的属性名<if test"brand!null and brand! ">sql语句</if>注意如果where中都是if&am…