求大佬来找错
查看原帖
求大佬来找错
1304266
Charzie楼主2024/5/5 09:56

本地对但是传到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;
}
2024/5/5 09:56
加载中...