QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#401063 | #5433. Absolute Difference | comeintocalm | WA | 0ms | 3920kb | C++20 | 3.8kb | 2024-04-27 21:27:42 | 2024-04-27 21:27:42 |
Judging History
answer
#include <bits/stdc++.h>
using db = double;
int main() {
// freopen("in", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
std::vector<std::pair<int,int>> a(n), b(m);
std::vector<std::pair<int,int>> sa, sb;
bool fa = false, fb = false;
for (auto &[x, y] : a) {
scanf("%d%d", &x, &y);
if (x != y) {
fa = true;
}
}
for (auto &[x, y] : b) {
scanf("%d%d", &x, &y);
if (x != y) {
fb = true;
}
}
std::sort(a.begin(), a.end());
std::sort(b.begin(), b.end());
int l = -1;
for (auto &&[x, y]: a) {
int r = l;
while (r + 1 < m && b[r + 1].first < y) {
++r;
}
for (int i = l + 1; i <= r && l < r; ++i) {
if (b[i].second <= x) {
sa.emplace_back(b[i]);
++l;
continue;
}
if (b[i].first < x) {
sb.emplace_back(b[i].first, x);
b[i].first = x;
}
if (b[i].first > x) {
sa.emplace_back(x, b[i].first);
x = b[i].first;
}
if (b[i].second > x) {
sa.emplace_back(x, y);
sb.emplace_back(x, y);
x = y;
b[i].first = y;
} else {
sa.emplace_back(b[i]);
sb.emplace_back(b[i]);
x = b[i].second;
b[i].first = b[i].second;
++l;
}
}
if (x < y) {
sa.emplace_back(x, y);
}
}
for (int r = l + 1; r < m; ++r) {
sb.emplace_back(b[r]);
}
double ans = 0;
n = sa.size(), m = sb.size();
// std::cout << n << ' ' << m << std::endl;
std::vector<long long> prea, pre1(n);
auto get = [] (int l, int r, std::vector<long long> &pre) -> long long {
if (l > r) {
return 0;
}
if (l == 0) {
return pre[r];
}
return pre[r] - pre[l - 1];
};
if (!fa && fb) {
std::swap(fa, fb);
std::swap(a, b);
}
if (!fb) {
n = a.size();
prea.assign(n, 0);
for (int i = 0; i < n; ++i) {
prea[i] = (a[i].second + a[i].first);
if (i > 0) {
prea[i] += prea[i - 1];
}
}
// puts("q");
for (auto &[l1, r1]: b) {
int p = std::lower_bound(a.begin(), a.end(), std::make_pair(l1, r1)) - a.begin();
// printf("p %d\n", p);
ans += (1ll * (p) * l1 - get(0, p - 1, prea) / 2.0);
if (p < m) {
ans += (get(p, m - 1, prea) / 2.0 - 1ll * (m - p) * l1);
}
}
} else {
for (int i = 0; i < n; ++i) {
pre1[i] = (sa[i].second + sa[i].first);
if (i > 0) {
pre1[i] += pre1[i - 1];
}
}
for (auto &[l1, r1]: sb) {
int p = std::lower_bound(sa.begin(), sa.end(), std::make_pair(l1, r1)) - sa.begin();
bool flag = false;
if (p < m) {
auto &[l2, r2] = sa[p];
if (l1 == l2 && r1 == r2) {
ans += (r1 - l1) / 3.0;
++p;
flag = true;
}
}
if (p < m) {
ans += (get(p, m - 1, pre1) - 1ll * (m - p) * (l1 + r1)) / 2.0;
}
if (flag) {
--p;
}
if (p >= 0) {
ans += (1ll * (p) * (l1 + r1) - get(0, p - 1, pre1)) / 2.0;
}
}
}
printf("%.16lf\n", ans);
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3920kb
input:
1 1 0 1 0 1
output:
-1.6666666666666670
result:
wrong answer 1st numbers differ - expected: '0.3333333', found: '-1.6666667', error = '2.0000000'