Skip to content

Commit 447ecdc

Browse files
authored
Example of BS on real values
1 parent d05f11d commit 447ecdc

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <bits/stdc++.h>
2+
#include <string.h>
3+
#define int long long
4+
#define MAX (int)(1e7+5)
5+
#define MAX2D (int)(1e3+5)
6+
#define itn int
7+
#define inf 5e18
8+
#define MOD (int)(1e9 + 7)
9+
#define pb push_back
10+
#define mk make_pair
11+
#define all(x) x.begin(), x.end()
12+
#define rall(x) x.rbegin(),x.rend()
13+
#define pii pair<int, int>
14+
#define vii vector<pii>
15+
#define vi vector<int>
16+
#define vll vector<unsigned int>
17+
#define test \
18+
int t; \
19+
cin >> t; \
20+
while (t--)
21+
#define fast \
22+
ios_base ::sync_with_stdio(0); \
23+
cin.tie(NULL); \
24+
cout.tie(NULL)
25+
using namespace std;
26+
27+
int n,L;
28+
const int N = 1e5+1;
29+
vector<double> a(N);
30+
double eps = 1e-6;
31+
32+
bool good(double m) {
33+
double t1 = m, t2 = m;
34+
double speed1 = 1, speed2 = 1;
35+
double pos1 = 0, pos2 = L;
36+
for(int i=1;i<=n+1;i++) {
37+
if(speed1*t1*1.0f >= 1.0f*((a[i]-a[i-1]))) pos1 += 1.0f*(a[i]-a[i-1]), t1 -= (1.0f*(a[i]-a[i-1]))/speed1, speed1++;
38+
else pos1 += 1.0f*speed1*t1, t1 = 0;
39+
t1 = max(t1, (double)0);
40+
}
41+
for(int i=n;i>=0;i--) {
42+
if(speed2*t2*1.0f >= 1.0f*(a[i+1]-a[i])) pos2 -= 1.0f*(a[i+1]-a[i]), t2 -= (1.0f*(a[i+1]-a[i]))/speed2, speed2++;
43+
else pos2 -= 1.0f*speed2*t2, t2 = 0;
44+
t2 = max(t2, (double)0);
45+
}
46+
if((pos2-pos1) <= 0.00001) return true;
47+
return false;
48+
}
49+
50+
double f() {
51+
double l = 0, r = L;
52+
double ans = l;
53+
for(int i=0;i<200 && l+eps <= r;i++) {
54+
double mid = (l+r)*0.5f;
55+
if(good(mid)) ans = mid, r = mid;
56+
else l = mid;
57+
}
58+
return ans;
59+
}
60+
signed main()
61+
{
62+
fast;
63+
test {
64+
cin>>n>>L;
65+
a.resize(n+2);
66+
for(int i=1;i<=n;i++) cin>>a[i];
67+
a[0] = 0, a[n+1] = L;
68+
cout<<fixed<<setprecision(16);
69+
cout<<f()<<"\n";
70+
}
71+
return 0;
72+
}

0 commit comments

Comments
 (0)