本地对但是传到CF上之后就UKE了?
#include<bits/stdc++.h>
using namespace std;
const int MX = 2e5 + 5;
const double pi = 3.14159265358979323846;
double a[MX], x[MX];
int n, d, m;
int ml[MX];
int read() {
int res = 0, fl = 0;
char a = getchar();
while(a < '0' || a > '9') fl |= a == '-', a = getchar();
while(a >= '0' && a <= '9') res = res * 10 + a - '0', a = getchar();
return fl ? -res : res;
}
int main() {
n = read(), d = read();
for(int i = 1; i <= n; ++ i) a[i] = read();
m = read();
for(int i = 1; i <= m; ++ i) x[i] = read();
for(int i = 1, j = 1; j <= m; ++ j) {
while(i <= n && a[i] < x[j]) {
++ i;
}
ml[j] = i - 1;
}
double ans;
for(int i = 1; i <= m; ++ i) {
int l = ml[i], r = l + 1;
if(x[i] <= a[1]) {
ans = atan(1.0 / (a[1] - x[i]));
printf("%.12lf\n", ans);
continue;
}
if(x[i] > a[n]) {
ans = atan(1.0 / (x[i] - a[n] - 1));
printf("%.12lf\n", ans);
continue;
}
if(a[r] == a[l]+1) {
printf("%.12lf\n", pi);
continue;
}
if(a[r] == x[i] || a[l] == x[i] - 1) {
printf("%.12lf\n", pi / 2.0);
continue;
}
ans = atan(1.0 / (min(a[r] - x[i], x[i] - 1.0 - a[l])));
d = min(a[r] - x[i], x[i] - a[l]);
while(l >= 1 && r <= n && a[l] >= x[i] - 2 * d - 10 && a[r] <= x[i] + 2 * d + 10) {
if(x[i] - a[l] - 1 == a[r] - x[i]) {
ans = max(ans, atan(1.0 / (a[r] - x[i])) * 2.0);
break;
}
if(x[i] - a[l] - 1 == a[r] - x[i] + 1) {
ans = max(ans, atan(1.0 / (a[r] - x[i] + 1)) * 2.0);
break;
}
if(x[i] - a[l] == a[r] - x[i]) {
ans = max(ans, atan(1.0 / (x[i] - a[l])) * 2.0);
break;
}
if(a[r] - x[i] >= x[i] - a[l] + 1) -- l;
else ++ r;
}
printf("%.12lf\n", ans);
}
return 0;
}