QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#822227 | #9869. Horizon Scanning | potpot | WA | 88ms | 4268kb | C++20 | 3.1kb | 2024-12-20 02:09:06 | 2024-12-20 02:09:07 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
template <class T> int sgn(T x) { return (x > 0) - (x < 0); }
template<class T>
struct Point {
typedef Point P;
T x, y;
explicit Point(T x=0, T y=0) : x(x), y(y) {}
bool operator<(P p) const { return tie(x,y) < tie(p.x,p.y); }
bool operator==(P p) const { return tie(x,y)==tie(p.x,p.y); }
P operator+(P p) const { return P(x+p.x, y+p.y); }
P operator-(P p) const { return P(x-p.x, y-p.y); }
P operator*(T d) const { return P(x*d, y*d); }
P operator/(T d) const { return P(x/d, y/d); }
T dot(P p) const { return x*p.x + y*p.y; }
T cross(P p) const { return x*p.y - y*p.x; }
T cross(P a, P b) const { return (a-*this).cross(b-*this); }
T dist2() const { return x*x + y*y; }
double dist() const { return sqrt((double)dist2()); }
// angle to x-axis in interval [-pi, pi]
double angle() const { return atan2(y, x); }
P unit() const { return *this/dist(); } // makes dist()=1
P perp() const { return P(-y, x); } // rotates +90 degrees
P normal() const { return perp().unit(); }
// returns point rotated 'a' radians ccw around the origin
P rotate(double a) const {
return P(x*cos(a)-y*sin(a),x*sin(a)+y*cos(a)); }
friend ostream& operator<<(ostream& os, P p) {
return os << "(" << p.x << "," << p.y << ")"; }
};
void solve() {
int n, k;
cin >> n >> k;
vector<Point<int>> islands(n);
for (int i = 0; i < n; i++) {
cin >> islands[i].x >> islands[i].y;
}
sort(islands.begin(), islands.end(), [](const auto& a, const auto &b) {
return a.angle() < b.angle();
});
vector<pair<Point<int>, int>> angles;
for (int i = 0; i < islands.size(); i++) {
double cur_angle = islands[i].angle();
if (angles.size() == 0 || abs(cur_angle - angles[angles.size()-1].first.angle()) > 1e-5) {
angles.push_back(make_pair(islands[i], 1));
}
else {
angles[angles.size()-1].second++;
}
}
// add 360o
int sz = angles.size();
for (int i = 0; i < sz; i++) {
angles.push_back(make_pair(angles[i].first.rotate(2 * M_PI), angles[i].second));
}
double ans = 0.0;
int l = 0, r = 0, cur_cnt = angles[0].second;
while (r < angles.size()-1) {
while (r < l + sz && (cur_cnt <= k || l == r)) {
r++;
cur_cnt += angles[r].second;
}
if (l >= 0 && l < angles.size() && r >= l && r < angles.size()) {
double angle_diff = angles[r].first.angle() - angles[l].first.angle();
if (angle_diff < 0) angle_diff += 2 * M_PI;
if (r == l + sz) angle_diff = 2 * M_PI;
// cout << "test " << l << " " << r << " " << angle_diff << "\n";
ans = max(ans, angle_diff);
}
while (l+1 <= r && cur_cnt > k) {
cur_cnt -= angles[l].second;
l++;
}
}
cout << fixed << setprecision(10) << ans << "\n";
}
int main() {
ios::sync_with_stdio(false);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 4160kb
input:
5 1 1 0 1 8 2 1 0 1 1 0 1 -1 1 -1 0 -1 -1 0 -1 1 -1 4 2 -1 1 0 1 0 2 1 1 4 2 -1000000000 0 -998244353 1 998244353 1 1000000000 0 3 1 0 1 0 2 0 -1
output:
6.2831853072 1.5707963268 5.4977871438 3.1415926546 3.1415926536
result:
ok 5 numbers
Test #2:
score: -100
Wrong Answer
time: 88ms
memory: 4268kb
input:
10000 16 1 -10 -6 -5 -6 -4 9 -2 5 -2 10 1 -7 1 -5 1 6 3 1 4 -9 6 -10 6 -3 6 1 8 -5 8 -4 9 -4 17 4 -9 2 -8 -4 -8 -3 -8 -1 -6 -2 -6 -1 -6 8 -5 -8 -5 10 -4 8 -2 -8 4 -9 4 0 5 -3 8 -5 9 -2 10 10 10 6 -7 2 -4 6 -2 -7 -2 -1 -1 7 1 -9 1 8 3 -4 7 -4 9 -2 14 3 -9 10 -8 -10 -8 -8 -6 -7 -6 -5 -1 -7 -1 -2 0 -1 ...
output:
1.6162196062 2.5748634361 4.6093073719 2.6658974347 5.6396841984 4.8576989910 3.2959114295 2.7187387275 6.2831853072 6.2831853072 4.8986118208 6.0825324299 3.7471373172 2.3424967168 3.3602615995 6.2831853072 5.9614347528 3.3624214233 5.2627749281 5.6724593428 5.9244146369 6.2166171434 2.3561944902 6...
result:
wrong answer 1st numbers differ - expected: '1.6929915', found: '1.6162196', error = '0.0453469'