Dd đang chơi Terraria và vừa mở khóa được vũ khí mới: North Pole.
Mỗi lần sử dụng, vũ khí này bắn một quả cầu tuyết tại vị trí ~(s_i, 0)~ với vector vận tốc ~\vec{v_i} = ({v_x}_i, {v_y}_i)~. Ta giả sử gia tốc trọng trường ~G = 9.8~ và không có lực cản của không khí.
Trên đường bay của quả cầu tuyết sẽ xuất hiện các bông tuyết rơi thẳng đứng và khi rơi xuống sẽ gây sát thương. Quả cầu tuyết biến mất khi chạm đất. Trong bài toán này, có vô số bông tuyết được tạo ra, nghĩa là nếu người chơi đứng dưới đường bay của một quả cầu tuyết thì chắc chắn sẽ bị sát thương.
Demo của vũ khí North Pole.
Yêu cầu: Tính tổng diện tích trên bản đồ mà người chơi đứng ở đó sẽ bị sát thương.
Input
Dòng đầu tiên gồm số nguyên ~n \:(1 \le n \le 1000)~ — số lần Dd sử dụng vũ khí.
~n~ dòng tiếp theo, mỗi dòng gồm 3 số nguyên ~s_i, {v_x}_i, {v_y}_i \:(0 \le s_i \le 10^9, 1 \le {v_x}_i, {v_y}_i \le 1000)~ — tọa độ và vận tốc của cầu tuyết thứ ~i~.
Output
- In ra một dòng duy nhất chứa 1 số thập phân — đáp án của bài toán. Đáp án được chấp nhận nếu sai số không quá ~10^{-6}~.
Scoring
Subtask | Điểm | Giới hạn |
---|---|---|
1 | ~15\%~ | Không có quỹ đạo của 2 cầu tuyết nào giao nhau hoặc nằm trong nhau. |
2 | ~25\%~ | ~n \le 100~ |
3 | ~60\%~ | Không có ràng buộc gì thêm. |
Sample Input 1
1
0 1 1
Sample Output 1
0.0069415521
Sample Input 2
2
0 3 5
2 5 2
Sample Output 2
2.7463907059
Notes
Quỹ đạo cầu tuyết trong ví dụ 1.
Quỹ đạo các cầu tuyết trong ví dụ 2.
Bình luận
include <bits/stdc++.h> // QioCas
define FOR(i,l,r) for(int i=(l); i<=(r); ++i)
define REP(i,l,r) for(int i=(l); i<(r); ++i)
define FORD(i,r,l) for(int i=(r); i>=(l); --i)
define REPD(i,r,l) for(int i=(r)-1; i>=(l); --i)
ifdef LOCAL
include </home/cas/Cp/Lib/debug.h>
else
define console(...) void(10062006)
endif
using namespace std; using ll = long long;
const int N = 1003; const double G = 9.8; const double EPS = 1e-9;
struct Ball { public: double a() const { return B; } double b() const { return A - 2.00 * B * st; }; double c() const { return B * st * st - A * st; }; double F(double x) const { return B * (x - st) * (x - st) * (x - st) / 3.00 + A * (x - st) * (x - st) / 2.00; } double F(double l, double r) const { return F(r) - F(l); }
private: double A, B; };
struct Compress : vector<double> { void load() { sort(this->begin(), this->end()); this->resize(unique(this->begin(), this->end()) - this->begin()); } int prod(const double& val) { return lower_bound(this->begin(), this->end(), val) - this->begin(); } };
int n; Ball a[N]; Compress cps;
void optimize(double l, double r, int& u, int idx) { if(u == 0 || a[u].F(l, r) < a[idx].F(l, r)) u = idx; }
struct Interval { #define mid ((l + r) >> 1) int IT[1000006 << 2];
} event;
int c = 0; double at[7];
inline void add(double x) { if(c > 0 && at[c - 1] == x) return; at[c++] = x; if(c >= 2 && at[c - 2] > at[c - 1]) std::swap(at[c - 1], at[c - 2]); }
bool is_used[N];
int main() { cin.tie(NULL)->syncwithstdio(false); cin >> n; FOR(i, 1, n) a[i].input(); FOR(i, 1, n) { cps.pushback(a[i].st); cps.pushback(a[i].en); } FOR(u, 1, n) FOR(v, u + 1, n) { vector<double> its = intersect(a[u], a[v]); for(const double& x : its) cps.push_back(x); } cps.load(); int m = cps.size();
}
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
cam cha cai mom vao