QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#800820 | #9657. Farm | jiangly (Lingyu Jiang) | AC ✓ | 1070ms | 15676kb | C++23 | 3.0kb | 2024-12-06 15:53:59 | 2024-12-06 15:54:02 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
using F = long double;
struct Pt {
F s;
F v;
int a;
friend auto operator<=>(const Pt &a, const Pt &b) = default;
};
void solve() {
int N, W, H, Q;
std::cin >> N >> W >> H >> Q;
std::vector<Pt> p;
p.push_back({0, 0, -1});
p.push_back({F(W), 0, 1});
for (int i = 0; i < N; i++) {
int x1, x2, y;
std::cin >> x1 >> x2 >> y;
p.push_back({F(x1) * H / y, F(y - H) / y, 1});
p.push_back({F(x2) * H / y, F(y - H) / y, -1});
}
std::sort(p.begin(), p.end());
const int K = p.size();
std::vector<int> pre(K);
pre[0] = 1;
F V = 0, S = 0;
auto add = [&](int i, int coef) {
if (pre[i] == 0) {
S += (p[i].s - p[i - 1].s) * coef;
V += (p[i].v - p[i - 1].v) * coef;
}
};
for (int i = 0; i < K - 1; i++) {
pre[i + 1] = pre[i] + p[i].a;
}
for (int i = 1; i < K; i++) {
add(i, 1);
}
std::vector<int> x(Q);
for (int i = 0; i < Q; i++) {
std::cin >> x[i];
}
std::vector<int> q(Q);
std::iota(q.begin(), q.end(), 0);
std::sort(q.begin(), q.end(),
[&](int i, int j) {
return x[i] < x[j];
});
std::priority_queue<std::pair<F, int>, std::vector<std::pair<F, int>>, std::greater<>> pq;
auto getTime = [&](int i) -> F {
if (p[i - 1].v <= p[i].v) {
return INFINITY;
}
return (p[i].s - p[i - 1].s) / (p[i - 1].v - p[i].v);
};
auto work = [&](int i) {
auto t = getTime(i);
if (t != INFINITY) {
pq.emplace(t, i);
}
};
for (int i = 1; i < K; i++) {
work(i);
}
std::vector<F> ans(Q);
for (auto k : q) {
while (!pq.empty() && pq.top().first < x[k]) {
auto [t, i] = pq.top();
pq.pop();
if (t != getTime(i)) {
continue;
}
for (int j = std::max(1, i - 1); j <= std::min(K - 1, i + 1); j++) {
add(j, -1);
}
pre[i] += p[i].a - p[i - 1].a;
std::swap(p[i - 1], p[i]);
for (int j = std::max(1, i - 1); j <= std::min(K - 1, i + 1); j++) {
add(j, 1);
work(j);
}
}
ans[k] = (S + V * x[k]) / W;
}
for (int i = 0; i < Q; i++) {
std::cout << ans[i] << "\n";
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout << std::fixed << std::setprecision(10);
int t;
std::cin >> t;
for (int i = 1; i <= t; i++) {
std::cout << "Case " << i << ":\n";
solve();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1070ms
memory: 15676kb
input:
50 6 6 6 46 4 5 5 4 6 3 4 5 1 4 6 2 1 2 4 5 6 4 3 6 1 1 3 4 1 6 5 2 4 0 5 4 6 6 4 1 5 4 3 6 5 4 4 2 6 0 2 1 5 4 1 6 0 5 3 3 4 0 2 2 3 1 2 1 5 7 6 42 3 5 2 5 7 5 1 3 1 0 1 3 0 2 4 6 1 6 6 1 7 6 4 5 7 5 2 2 2 3 3 4 4 0 5 1 7 3 3 6 6 4 4 3 2 3 1 2 0 6 2 4 1 0 2 4 1 9 6 10 28 0 2 8 4 6 5 1 3 3 4 5 1 0 2...
output:
Case 1: 0.4500000000 0.0000000000 0.5500000000 0.5500000000 0.4500000000 0.5000000000 0.5500000000 0.0000000000 0.0000000000 0.5500000000 0.5000000000 0.5500000000 0.0000000000 0.5000000000 0.0000000000 0.0000000000 0.5000000000 0.5500000000 0.0000000000 0.5000000000 0.4500000000 0.0000000000 0.0000...
result:
ok 1529581 lines
Extra Test:
score: 0
Extra Test Passed