看了题解应该都知道是二分答案,二分答案关键在于怎么检验答案
-
如何检验答案 根据我们小学二年级学的,速度是相对的
- 我们可以这么规定向左的速度为0,那么向右的速度为2
此时我们可以一个一个计算向右的通过了多少个静止不动的
- 例如,现在当前的向右的位置为
,在当前时间
下,到达
+
,因此只要在
+
内静止不动的都能被计算在内
这下问题就转化成如何高效统计这个区间内静止的球:
假如两个向右的球相邻,我们依次得到两个区间
,区间的范围指的是静止不动的球的数组的下标
那么必然
所以我们可以排序,然后利用双指针逐渐找到对于每一个向右的球的区间
CODE
(跟雨巨orz学的
#include<bits/stdc++.h>
using namespace std;
#define p first
#define v second
const int maxn=1e5+10;
typedef pair<int,int> pii;
int n,k;
vector<int>a,b;
bool check(double x){
int cnt=0;
int l=0,r=0;
int len=b.size();
for(auto i:a){
while(l<len && b[l]<i) ++l;
while(r<len && b[r]<=i+2*x) ++r;
cnt+=r-l;
}
return cnt>=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i){
int p,v;
cin>>p>>v;
if(v==1) a.push_back(p);
else b.push_back(p);
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
double l=0,r=1e9+10;
while((r-l)>1e-6){
double mid=(l+r)/2;
if(check(mid)) r=mid-1e-6;
else l=mid+1e-6;
}
if(r==1e9+10) puts("No");
else {
puts("Yes");
cout<<fixed<<setprecision(6)<<l<<"\n";
}
}