QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#735145 | #9576. Ordainer of Inexorable Judgment | BDDL | WA | 1ms | 4276kb | C++23 | 2.8kb | 2024-11-11 17:45:38 | 2024-11-11 17:45:39 |
Judging History
你现在查看的是最新测评结果
- [2024-12-23 14:23:26]
- hack成功,自动添加数据
- (/hack/1303)
- [2024-12-06 11:32:56]
- hack成功,自动添加数据
- (/hack/1271)
- [2024-11-14 21:58:28]
- hack成功,自动添加数据
- (/hack/1181)
- [2024-11-11 17:45:38]
- 提交
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const double PI = acos(-1);
const double eps = 1e-8;
struct point
{
double x, y;
};
double sign(double a)
{
if(fabs(a) < eps)
return 0;
if(a < 0)
return -1;
return 1;
}
point operator- (point a, point b)
{
return {a.x - b.x, a.y - b.y};
}
point operator/ (point a, double b)
{
return {a.x / b, a.y / b};
}
point operator* (point a, double b)
{
return {a.x * b, a.y * b};
}
point rotate(point a, double b)
{
return {a.x * cos(b) + a.y * sin(b), -a.x * sin(b) + a.y * cos(b)};
}
double cross(point a, point b)
{
return a.x * b.y - a.y * b.x;
}
double get_dist(point a, point b)
{
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
void solve()
{
point O = {0, 0};
double n, d, t;
point v0;
cin >> n >> v0.x >> v0.y >> d >> t;
vector<point> a(n + 1);
for(int i = 1; i <= n; i ++)
{
int x, y;
cin >> x >> y;
a[i] = (point){x, y};
}
double l, r;
l = atan2(v0.y, v0.x);
if(l < 0)
l += PI * 2;
r = l + PI * 2;
point vl = v0;
while(r - l > eps)
{
double mid = (l + r) / 2;
point v = rotate(vl, l - mid);
point p = rotate(v, -PI / 2) / get_dist(O, v) * d;
bool flag = false;
for(int i = 1; i <= n; i ++)
{
if(sign(cross(v, a[i] - p)) < 0)
flag = true;
}
if(flag)
r = mid;
else
{
l = mid;
vl = v;
}
}
double st_angle = l;
// cerr << l << endl;
l = atan2(v0.y, v0.x);
// cerr << l << endl;
if(l < 0)
l += PI * 2;
r = l + PI * 2;
vl = v0;
while(r - l > eps)
{
double mid = (l + r) / 2;
// cerr << mid << endl;
point v = rotate(vl, l - mid);
point p = rotate(v, PI / 2) / get_dist(O, v) * d;
// cerr << p.x << ' ' << p.y << endl;
bool flag = false;
int num = 0;
for(int i = 1; i <= n; i ++)
{
if(sign(cross(v, a[i] - p)) > 0)
flag = true;
}
if(flag)
{
l = mid;
vl = v;
}
else
r = mid;
}
double ed_angle = l;
// cerr << l << endl;
int cnt = t / (PI * 2);
t -= cnt * PI * 2;
double v0_angle = atan2(v0.y, v0.x);
if(v0_angle < 0)
v0_angle += PI * 2;
double v1_angle = v0_angle + t;
double ans = max(0.0, min(ed_angle, v1_angle) - max(st_angle, v0_angle)) + cnt * (ed_angle - st_angle);
printf("%.7lf\n", ans);
}
signed main()
{
int T = 1;
while (T --) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 4200kb
input:
3 1 0 1 1 1 2 2 1 2 2
output:
1.0000000
result:
ok found '1.0000000', expected '1.0000000', error '0.0000000'
Test #2:
score: 0
Accepted
time: 0ms
memory: 4104kb
input:
3 1 0 1 2 1 2 2 1 2 2
output:
1.5707963
result:
ok found '1.5707963', expected '1.5707963', error '0.0000000'
Test #3:
score: 0
Accepted
time: 0ms
memory: 4140kb
input:
3 1 0 1 10000 1 2 2 1 2 2
output:
2500.7077429
result:
ok found '2500.7077429', expected '2500.7077523', error '0.0000000'
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 4276kb
input:
3 10000 10000 1 10000 10000 9999 10000 10000 9999 10000
output:
9999.9999907
result:
wrong answer 1st numbers differ - expected: '0.3842413', found: '9999.9999907', error = '9999.6157494'