题解 AT_abc294F【Sugar Water 2】
_Imaginary_ · · 题解
Problem
有两组糖水,分别有
Solution
我们先对
要求浓度第
观察到数据范围是
于是,我们可以在外面套一个二分,转化求
再进行变形,首先进行通分,得到
这时,我们可以先用
有两个数组
首先用
这样,由于
Code
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define y1 y11
const int N=500005;
int n,m;
ll k;
ll x1[N],y1[N],x2[N],y2[N];
ld a[N];
int get(ld x)
{
int L=1,R=m,mid;
while(L<=R)
{
mid=(L+R)>>1;
if(x>a[mid]) L=mid+1;
else R=mid-1;
}
return R;
}
ll check(ld k)
{
for(int i=1;i<=m;i++) a[i]=(ld)x2[i]*k-(ld)y2[i];
sort(a+1,a+m+1);
ll ans=0;
for(int i=1;i<=n;i++)
ans+=get((ld)y1[i]-k*(ld)x1[i]);
return ans;
}
int main()
{
scanf("%d%d%lld",&n,&m,&k);
for(int i=1;i<=n;i++) scanf("%lld%lld",&x1[i],&y1[i]);
for(int i=1;i<=m;i++) scanf("%lld%lld",&x2[i],&y2[i]);
ld L=0.0,R=1e20,mid;
while(R-L>1e-14)
{
mid=(L+R)/2.0;
if(check(mid)>=1ll*n*m-k+1) L=mid;
else R=mid;
}
printf("%.11Lf",100.0/(1.0+L));
return 0;
}
后记
个人观点:
| 数据范围 | 一般的复杂度 | AtCoder 上常见的复杂度 |
|---|---|---|