QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#608003 | #5433. Absolute Difference | Luuu | WA | 2ms | 4516kb | C++20 | 5.6kb | 2024-10-03 17:38:46 | 2024-10-03 17:38:46 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
using db = long double;
#define fi first
#define se second
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(20);
int n, m;
cin >> n >> m;
vector<pair<int, int>> a(n), b(m);
for (auto &[l, r] : a) {
cin >> l >> r;
}
for (auto &[l, r] : b) {
cin >> l >> r;
}
sort(a.begin(), a.end());
sort(b.begin(), b.end());
auto check = [&](const vector<pair<int, int>> &t) {
for (auto [x, y] : t) {
if (x != y) {
return true;
}
}
return false;
};
auto work = [&](const vector<pair<int, int>> &t) {
vector<pair<int, int>> ret;
for (auto [x, y] : t) {
if (x != y) {
ret.push_back({x, y});
}
}
return ret;
};
bool oka = check(a), okb = check(b);
if (oka) {
a = work(a);
n = a.size();
}
if (okb) {
b = work(b);
m = b.size();
}
if (!oka && !okb) {
vector<int> s(m + 1);
for (int i = 1; i <= m; i++) {
s[i] = s[i - 1] + b[i - 1].fi;
}
auto query = [&](int ql, int qr) {
return s[qr] - s[ql - 1];
};
db ans = 0;
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi <= x) {
l = mid;
} else {
r = mid;
}
}
if (l == -1) {
continue;
}
ans += (l + 1) * x - query(1, l + 1);
}
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi >= x) {
r = mid;
} else {
l = mid;
}
}
if (r == m) {
continue;
}
ans += query(r + 1, m) - (m - r) * x;
}
ans /= n, ans /= m;
cout << ans << "\n";
return 0;
}
if (oka && !okb) {
swap(oka, okb);
swap(a, b);
}
if (!oka && okb) {
set<int> s;
for (auto [x, y] : a) {
s.insert(x);
}
for (auto [x, y] : b) {
s.insert(x);
s.insert(y);
}
vector<int> p(s.begin(), s.end());
vector<pair<int, int>> nb;
db L = 0;
for (int i = 1; i < p.size(); i++) {
int x = p[i - 1], y = p[i];
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi <= x) {
l = mid;
} else {
r = mid;
}
}
if (l == -1 || b[l].se < y) {
continue;
}
nb.push_back({x, y});
L += (y - x);
}
b = nb;
m = b.size();
vector<db> s1(m + 1), s2(m + 1);
for (int i = 1; i <= m; i++) {
s1[i] = s1[i - 1] + (b[i - 1].se - b[i - 1].fi);
s2[i] = s2[i - 1] + 1.0 * (b[i - 1].se - b[i - 1].fi) * (b[i - 1].fi + b[i - 1].se) / 2;
}
auto qry1 = [&](int ql, int qr) {
return s1[qr] - s1[ql - 1];
};
auto qry2 = [&](int ql, int qr) {
return s2[qr] - s2[ql - 1];
};
db ans = 0;
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].se <= x) {
l = mid;
} else {
r = mid;
}
}
if (l == -1) {
continue;
}
ans += x * qry1(1, l + 1) - qry2(1, l + 1);
}
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi >= x) {
r = mid;
} else {
l = mid;
}
}
if (r == m) {
continue;
}
ans += qry2(r + 1, m) - x * qry1(r + 1, m);
}
ans /= n;
ans /= L;
cout << ans << "\n";
return 0;
}
set<int> s;
for (auto [x, y] : a) {
s.insert(x);
s.insert(y);
}
for (auto [x, y] : b) {
s.insert(x);
s.insert(y);
}
vector<int> p(s.begin(), s.end());
vector<pair<int, int>> na;
vector<pair<int, int>> nb;
db La = 0, Lb = 0;
for (int i = 1; i < p.size(); i++) {
int x = p[i - 1], y = p[i];
int l = -1, r = n;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (a[mid].fi <= x) {
l = mid;
} else {
r = mid;
}
}
if (l == -1 || a[l].se < y) {
continue;
}
na.push_back({x, y});
La += (y - x);
}
for (int i = 1; i < p.size(); i++) {
int x = p[i - 1], y = p[i];
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi <= x) {
l = mid;
} else {
r = mid;
}
}
if (l == -1 || b[l].se < y) {
continue;
}
nb.push_back({x, y});
Lb += (y - x);
}
a = na;
n = a.size();
b = nb;
m = b.size();
set<pair<int, int>> sb;
for (auto [x, y] : b) {
sb.insert({x, y});
}
vector<db> s1(m + 1), s2(m + 1);
for (int i = 1; i <= m; i++) {
s1[i] = s1[i - 1] + (b[i - 1].se - b[i - 1].fi);
s2[i] = s2[i - 1] + 1.0 * (b[i - 1].se - b[i - 1].fi) * (b[i - 1].fi + b[i - 1].se) / 2;
}
auto qry1 = [&](int ql, int qr) {
return s1[qr] - s1[ql - 1];
};
auto qry2 = [&](int ql, int qr) {
return s2[qr] - s2[ql - 1];
};
db ans = 0;
for (auto [x, y] : a) {
if (sb.count({x, y})) {
ans += 1.0 * (y - x) * (y - x) * (y - x) / 3 / La / Lb;
}
}
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].se <= x) {
l = mid;
} else {
r = mid;
}
}
ans += 1.0 * (y - x) * (0.5 * (x + y) * qry1(1, l + 1) - qry2(1, l + 1)) / La / Lb;
}
for (auto [x, y] : a) {
int l = -1, r = m;
while (l + 1 != r) {
int mid = (l + r) / 2;
if (b[mid].fi >= y) {
r = mid;
} else {
l = mid;
}
}
ans += 1.0 * (y - x) * (qry2(r + 1, m) - 0.5 * (x + y) * qry1(r + 1, m)) / La / Lb;
}
cout << ans << "\n";
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 4036kb
input:
1 1 0 1 0 1
output:
0.33333333333333331483
result:
ok found '0.333333333', expected '0.333333333', error '0.000000000'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3860kb
input:
1 1 0 1 1 1
output:
0.50000000000000000000
result:
ok found '0.500000000', expected '0.500000000', error '0.000000000'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3732kb
input:
1 1 -1000000000 1000000000 -1000000000 1000000000
output:
666666666.66666662966599687934
result:
ok found '666666666.666666627', expected '666666666.666666627', error '0.000000000'
Test #4:
score: 0
Accepted
time: 0ms
memory: 3924kb
input:
1 1 -1000000000 0 0 1000000000
output:
1000000000.00000000000000000000
result:
ok found '1000000000.000000000', expected '1000000000.000000000', error '0.000000000'
Test #5:
score: 0
Accepted
time: 0ms
memory: 3968kb
input:
1 1 -1000000000 -1000000000 -1000000000 1000000000
output:
1000000000.00000000000000000000
result:
ok found '1000000000.000000000', expected '1000000000.000000000', error '0.000000000'
Test #6:
score: 0
Accepted
time: 0ms
memory: 3924kb
input:
1 1 -999999999 1000000000 -1000000000 -1000000000
output:
1000000000.50000000000000000000
result:
ok found '1000000000.500000000', expected '1000000000.500000000', error '0.000000000'
Test #7:
score: 0
Accepted
time: 0ms
memory: 4020kb
input:
1 1 -1000000000 1000000000 -999999999 -999999999
output:
999999999.00000000052386894822
result:
ok found '999999999.000000000', expected '999999999.000000000', error '0.000000000'
Test #8:
score: 0
Accepted
time: 0ms
memory: 3928kb
input:
1 1 1000000000 1000000000 -1000000000 -1000000000
output:
2000000000.00000000000000000000
result:
ok found '2000000000.000000000', expected '2000000000.000000000', error '0.000000000'
Test #9:
score: 0
Accepted
time: 2ms
memory: 4516kb
input:
1000 1000 -2175 -2174 -1068 -1065 -1721 -1718 777 834 1162 1169 -3529 -3524 3966 3993 1934 1952 -234 -223 -4967 -4947 8500 8510 5272 5276 -6048 -6033 -34 -22 700 705 -7890 -7886 5538 5543 4114 4126 -9201 -9162 -1521 -1519 -5103 -5100 439 441 993 997 -1684 -1680 -8413 -8404 6724 6728 -3242 -3239 2616...
output:
6717.11714573945373585317
result:
ok found '6717.117145739', expected '6717.117145739', error '0.000000000'
Test #10:
score: -100
Wrong Answer
time: 0ms
memory: 4084kb
input:
1000 1000 -5010 -4999 -2128 -2113 -5798 -5765 705 713 -3956 -3938 -5308 -5307 6759 6772 -772 -770 -860 -859 2308 2323 -5500 -5500 5140 5177 -6747 -6733 7509 7511 8864 8870 -6382 -6374 1901 1904 -5763 -5760 3019 3027 2962 2963 -314 -301 -222 -203 -726 -724 -62 -58 -1203 -1195 -5216 -5215 -4298 -4292 ...
output:
6864.54274846149400701734
result:
wrong answer 1st numbers differ - expected: '6682.5811275', found: '6864.5427485', error = '0.0272292'