QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#800459#9576. Ordainer of Inexorable JudgmentHanoistWA 0ms2404kbC++142.0kb2024-12-06 11:10:222024-12-06 11:10:24

Judging History

你现在查看的是最新测评结果

  • [2024-12-23 14:23:26]
  • hack成功,自动添加数据
  • (/hack/1303)
  • [2024-12-06 11:32:56]
  • hack成功,自动添加数据
  • (/hack/1271)
  • [2024-12-06 11:10:24]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:2404kb
  • [2024-12-06 11:10:22]
  • 提交

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++){
        vec p = a[i],p1,p2,temp;
        double q = abs(acos(d / Dis(a[i],O)));
        p1 = rotate(p,q),p2 = rotate(p,-q);
        temp = (vec){p1.y,-p1.x},p1 = temp;
        temp = (vec){-p2.y,p2.x},p2 = temp;
        sl[i].x = atan2(p1.y,p1.x),sl[i].y = atan2(p2.y,p2.x);
        //printf("%Lf %Lf\n",sl[i].x,sl[i].y);
    }
    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,t);
    else res += min(res1,max((double)0.0,t - (mx + 2 * pi - st)));
    printf("%.12Lf\n",res);
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 2404kb

input:

3 1 0 1 1
1 2
2 1
2 2

output:

1.000000000000

result:

ok found '1.0000000', expected '1.0000000', error '0.0000000'

Test #2:

score: 0
Accepted
time: 0ms
memory: 2400kb

input:

3 1 0 1 2
1 2
2 1
2 2

output:

1.570796326795

result:

ok found '1.5707963', expected '1.5707963', error '0.0000000'

Test #3:

score: 0
Accepted
time: 0ms
memory: 2276kb

input:

3 1 0 1 10000
1 2
2 1
2 2

output:

2500.707752257475

result:

ok found '2500.7077523', expected '2500.7077523', error '0.0000000'

Test #4:

score: 0
Accepted
time: 0ms
memory: 2308kb

input:

3 10000 10000 1 10000
10000 9999
10000 10000
9999 10000

output:

0.384241300290

result:

ok found '0.3842413', expected '0.3842413', error '0.0000000'

Test #5:

score: -100
Wrong Answer
time: 0ms
memory: 2148kb

input:

3 -10000 -10000 10000 10000
-10000 -9999
-10000 -10000
-9999 -10000

output:

2500.081562054343

result:

wrong answer 1st numbers differ - expected: '2500.2406700', found: '2500.0815621', error = '0.0000636'