QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1271#800469#9576. Ordainer of Inexorable JudgmentquailtyHanoistSuccess!2024-12-06 11:32:442024-12-06 11:32:45

詳細信息

Extra Test:

Wrong Answer
time: 0ms
memory: 2104kb

input:

3 -10000 1 500 6
-501 -1
-501 -10000
-500 -10000

output:

3.076372258785

result:

wrong answer 1st numbers differ - expected: '2.7931870', found: '3.0763723', error = '0.1013843'

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#800469#9576. Ordainer of Inexorable JudgmentHanoistWA 0ms2108kbC++142.0kb2024-12-06 11:24:032024-12-06 11:40:37

answer

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<functional>
#include<utility>
#include<cassert>
using namespace std;
const int N = 111;
#define pi acos(-1)
#define double long double
int n;
struct vec{
    double x,y;
}a[N],sl[N << 1];
double sx,sy,d,t;
inline double Dis(vec a,vec b){
    return 1.0 * sqrt((a.y - b.y) * (a.y - b.y) + (a.x - b.x) * (a.x - b.x));
}
inline vec rotate(vec a,double ang){
    return (vec){a.x * cos(ang) - a.y * sin(ang),a.x * sin(ang) + a.y * cos(ang)};
}
bool cmp(vec u,vec v){
    if(u.x != v.x) return u.x < v.x;
    return u.y < v.y;
}
int main(){
    int i,j,k,x,y;
    vec O = {0,0};
    scanf("%d %Lf %Lf %Lf %Lf",&n,&sx,&sy,&d,&t);
    for(i = 1;i <= n;i++){
        scanf("%Lf %Lf",&a[i].x,&a[i].y);
    }
    for(i = 1;i <= n;i++){
        double p = atan2(a[i].y,a[i].x);
        double q = abs(acos(d / Dis(a[i],O)));
        sl[i].x = p + q - pi / 2,sl[i].y = p - q + pi / 2;
        //printf("%Lf %Lf\n",sl[i].x,sl[i].y);
        //if(sl[i].x > sl[i].y) sl[i].x -= 2 * pi;
    }
    sort(sl + 1,sl + n + 1,cmp);
    for(i = 1;i <= n;i++) sl[i + n] = {sl[i].x + 2 * pi,sl[i].y + 2 * pi};
    double res1,res,mx,my;
    for(i = 1;i <= n;i++){
        mx = 1e18,my = -1e18;
        for(j = i;j < n + i;j++){
            mx = min(sl[j].x,mx);
            my = max(sl[j].y,my);
        }
        if(my - mx <= pi){
            res1 = my - mx;
            k = i;
            break;
        }
    }
    res = (int)(t / 2 / pi) * res1;
    t -= 2 * pi * (int)(t / 2 / pi);
    double st = atan2(sy,sx);
    //printf("%Lf %d %Lf %Lf\n",st,k,mx,my);
    if(my - st > 2 * pi) st += 2 * pi;
    if(st < mx) res += min(res1,max((double)0.0,t - (mx - st)));
    else if(st <= my) res += min(my - st + max((double)0.0,t - (mx + 2 * pi - st)),t);
    else res += min(res1,max((double)0.0,t - (mx + 2 * pi - st)));
    printf("%.12Lf\n",res);
    return 0;
}