QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#884364 | #9547. Two Convex Holes | UESTC_NLNS | WA | 95ms | 4096kb | C++20 | 4.8kb | 2025-02-06 01:03:21 | 2025-02-06 01:03:21 |
Judging History
answer
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
using ldb = long double;
struct pt {
ldb x, y;
pt operator+(const pt& o) const { return {x + o.x, y + o.y}; };
pt operator-(const pt& o) const { return {x - o.x, y - o.y}; };
pt operator*(const ldb o) const { return {x * o, y * o}; };
ldb operator*(const pt& o) const { return o.x * x + o.y * y; }
ldb operator^(const pt& o) const { return x * o.y - y * o.x; }
};
pt rotate(const pt& a, const pt& v2) {
return {v2 * a, v2 ^ a};
}
struct seg {
pt a, b;
bool operator<(const seg& o) const {
if (a.y != o.a.y) a.y < o.a.y;
return b.y < o.b.y;
}
pt at(ldb y) const {
return (b * (y - a.y) + a * (b.y - y)) * (1 / (b.y - a.y));
}
};
struct poly {
ldb t, a0, a1, a2, a3;
bool operator<(const poly& o) const { return t < o.t; }
};
struct item {
ldb t, v1, v2;
};
void solve() {
pt a0, v;
ldb z0, z1, z2;
cin >> a0.x >> a0.y >> z0 >> v.x >> v.y;
int n1, n2;
cin >> n1 >> z1;
vector<pt> c1(n1);
for (int i = 0; i < n1; ++i) cin >> c1[i].x >> c1[i].y;
cin >> n2 >> z2;
vector<pt> c2(n2);
for (int i = 0; i < n2; ++i) cin >> c2[i].x >> c2[i].y;
ldb alp1 = z0 / (z0 - z1);
ldb alp2 = z0 / (z0 - z2);
v = v * (alp1 - alp2);
ldb beta = sqrtl(v * v);
v = v * (1 / beta);
for (auto& u : c1) u = rotate((u - a0) * alp1, v);
for (auto& u : c2) u = rotate((u - a0) * alp2, v);
vector<seg> s1, s2, s3, s4;
for (int i = 0; i < n1; ++i) {
auto a = c1[i], b = c1[i == n1 - 1 ? 0 : i + 1];
if (a.y > b.y)
s1.push_back({b, a});
else
s2.push_back({a, b});
}
for (int i = 0; i < n2; ++i) {
auto a = c2[i], b = c2[i == n2 - 1 ? 0 : i + 1];
if (a.y > b.y)
s3.push_back({b, a});
else
s4.push_back({a, b});
}
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
sort(s3.begin(), s3.end());
sort(s4.begin(), s4.end());
vector<item> q;
auto update = [&](const seg& s, const seg& t, ldb z0, ldb z1, int f) -> void {
if (z0 == z1) return;
auto a = s.at(z0), b = s.at(z1);
auto c = t.at(z0), d = t.at(z1);
ldb t1 = c.x - a.x, t2 = d.x - b.x;
if (t1 < t2) swap(t1, t2);
ldb val = z1 - z0;
if (t1 != t2) {
q.push_back({t1, 0, f * val / (t2 - t1)});
q.push_back({t2, 0, -f * val / (t2 - t1)});
} else {
q.push_back({t2, f * val, 0});
}
};
int cc = 0;
for (const auto& s : {s3, s4}) {
for (const auto& t : {s1, s2}) {
cc++;
int f = cc == 1 || cc == 4 ? -1 : 1;
ldb lst_z = max(s[0].a.y, t[0].a.y);
for (int i = 0, j = 0; i < s.size() && j < t.size();) {
if (s[i].b.y < t[j].a.y) {
i++;
continue;
}
if (t[j].b.y < s[i].a.y) {
j++;
continue;
}
ldb nz = min(s[i].b.y, t[j].b.y);
update(s[i], t[j], lst_z, nz, f);
lst_z = nz;
if (nz == t[j].b.y)
j++;
else
i++;
}
}
}
sort(q.begin(), q.end(), [&](const item& a, const item& b) { return a.t < b.t; });
vector<poly> ans;
ldb v0 = 0, v1 = 0, s = 0, ss = 0;
ldb lt = -1e50;
ans.push_back({lt, s, v0, v1});
for (int i = 0; i < q.size(); ++i) {
auto t = q[i].t;
auto dt = t - lt;
ss += s * dt + v0 * dt * dt / 2 + v1 * dt * dt * dt / 6;
s += v0 * dt + v1 * dt * dt / 2;
v0 += v1 * dt;
v0 += q[i].v1, v1 += q[i].v2;
lt = t;
ans.push_back({q[i].t, ss, s, v0, v1});
}
auto query = [&](ldb t) -> ldb {
auto [lt, a0, a1, a2, a3] = *(--upper_bound(ans.begin(), ans.end(), poly{t, 0, 0, 0}));
t -= lt;
return a0 + a1 * t + a2 * t * t / 2 + a3 * t * t * t / 6;
};
auto query2 = [&](ldb t) -> ldb {
auto [lt, a0, a1, a2, a3] = *(--upper_bound(ans.begin(), ans.end(), poly{t, 0, 0, 0}));
t -= lt;
return a1 + a2 * t + a3 * t * t / 2;
};
int cq;
cin >> cq;
for (int i = 0; i < cq; ++i) {
ldb t1, t2;
cin >> t1 >> t2;
t2 *= beta, t1 *= beta;
ldb ans = t1 == t2 ? query2(t1) : (query(t2) - query(t1)) / (t2 - t1);
printf("%.8LF\n", ans);
}
}
int main() {
cin.tie(0), cout.tie(0), ios::sync_with_stdio(0);
int t;
cin >> t;
while (t--) solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3968kb
input:
1 0 0 3 0 -1 4 1 1 0 3 0 3 2 1 2 4 2 0 0 1 0 1 1 0 1 3 0 10 1 2 1 1
output:
0.45000000 1.12500000 2.25000000
result:
ok 3 numbers
Test #2:
score: 0
Accepted
time: 1ms
memory: 3968kb
input:
1 -5448 2169 9 731 -431 64 1 -7417 -2691 -7203 -4235 -6869 -6172 -6746 -6856 -6628 -7104 -5983 -7731 -5755 -7926 -4211 -8457 -3739 -8585 -3653 -8604 -2307 -8877 -998 -9109 -201 -9110 874 -9110 2692 -8754 2984 -8696 3438 -8597 3671 -8536 5152 -8058 5700 -7775 5892 -7619 6304 -7221 7388 -5673 7742 -51...
output:
910.01768760
result:
ok found '910.01769', expected '910.01769', error '0.00000'
Test #3:
score: -100
Wrong Answer
time: 95ms
memory: 4096kb
input:
10000 -8 -1 6 -1 -5 3 1 -7 7 -6 -3 3 6 3 4 -7 3 10 -2 -7 4 5 5 7 1 1 0 0 0 5 1 8 -10 -4 10 -8 7 5 4 -9 1 -8 -7 4 -9 5 7 3 9 5 8 -8 4 2 -10 4 -8 10 1 8 9 7 3 9 1 3 7 9 6 10 3 9 0 1 3 3 -2 9 9 4 -3 3 4 -10 10 -6 -7 8 -5 3 5 -9 1 -2 -2 7 1 3 6 7 2 7 4 5 -10 4 7 -2 5 3 3 -10 7 -8 -9 -3 10 3 4 -9 9 2 -9 ...
output:
-0.00000000 -0.00000000 -0.00000000 -0.00000000 -0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 52.81830481 70.18546919 71.04629333 0.00000000 0.00000000 0.00437583 7.27590435 2.24042406 4.43672518 0.00000000 0.39874735 24.30553792 1.28024232 0.00000000 0.000...
result:
wrong answer 1162nd numbers differ - expected: '4.17909', found: '5.64583', error = '0.35097'