QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#325896 | #6763. Triangle Pendant | mshcherba | WA | 3ms | 4348kb | C++20 | 3.3kb | 2024-02-12 03:44:55 | 2024-02-12 03:44:56 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define RFOR(i, a, b) for(int i = (a) - 1; i >= (b); i--)
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
const db EPS = 1e-9;
void print(db a, db b, db c, int i)
{
if (i == 0)
cout << a << " " << b << " " << c << "\n";
else if (i == 1)
cout << b << " " << c << " " << a << "\n";
else
cout << c << " " << a << " " << b << "\n";
}
db getMedian(db a, db b, db c)
{
return sqrt(2 * (b * b + c * c) - a * a) / 2;
}
db getCos(db a, db b, db c)
{
db res = (b * b + c * c - a * a) / (2 * b * c);
assert(-1 - EPS < res && res < 1 + EPS);
return res;
}
db getThirdSide(db b, db c, db co)
{
return sqrt(b * b + c * c - 2 * b * c * co);
}
bool solve1(db x, db y, db z, db a, db b, db c, int i)
{
db m = getMedian(a, b, c);
db coB = getCos(a / 2, b, m), coC = getCos(a / 2, c, m);
db hb = -x - c * coC, hc = -x - b * coB;
if (getThirdSide(x, c, -coC) > y + EPS || getThirdSide(x, b, -coB) > z + EPS)
return false;
print(-x, hb, hc, i);
return true;
}
bool solve2(db x, db y, db z, db a, db b, db c, int i)
{
if (2 * max({x, y, c}) > x + y + c + EPS)
return false;
db mA = getMedian(a, b, c), mB = getMedian(b, c, a), mC = getMedian(c, a, b);
db AM = 2 * mA / 3, BM = 2 * mB / 3, CM = 2 * mC / 3;
db MAB = acos(getCos(BM, AM, c)), MBA = acos(getCos(AM, BM, c));
db DAB = acos(getCos(y, x, c)), DBA = acos(getCos(x, y, c));
db DM1 = getThirdSide(x, AM, cos(MAB + DAB));
db DM2 = getThirdSide(y, BM, cos(MBA + DBA));
assert(abs(DM1 - DM2) < EPS);
db CAB = acos(getCos(a, b, c)), CBA = acos(getCos(b, a, c));
db DC1 = getThirdSide(x, b, cos(CAB + DAB));
db DC2 = getThirdSide(y, a, cos(CBA + DBA));
assert(abs(DC1 - DC2) < EPS);
if (DC1 > z + EPS || abs(acos(getCos(c, x, y)) - acos(getCos(AM, x, DM1)) - acos(getCos(BM, y, DM2))) > EPS)
return false;
db cosCDM = getCos(CM, DM1, DC1);
print(-x * getCos(AM, x, DM1), -y * getCos(BM, y, DM2), -DC1 * cosCDM, i);
return true;
}
pair<db, db> getH(db x, db y, db z, db a, db b, db c)
{
db ma = getMedian(a, y, z), mA = getMedian(a, b, c);
db cosA = getCos(ma, x, mA);
db l = getThirdSide(2 * mA / 3, x, cosA);
cosA = getCos(2 * mA / 3, x, l);
return {-x * cosA, l};
}
void solve()
{
db x, y, z, a, b, c;
cin >> x >> y >> z >> a >> b >> c;
int ok1 = 0, ok2 = 0;
if (solve1(x, y, z, a, b, c, 0))
ok1++;
if (solve1(y, z, x, b, c, a, 1))
ok1++;
if (solve1(z, x, y, c, a, b, 2))
ok1++;
assert(ok1 <= 1);
if (ok1)
return;
if (solve2(x, y, z, a, b, c, 0))
ok2++;
if (solve2(y, z, x, b, c, a, 1))
ok2++;
if (solve2(z, x, y, c, a, b, 2))
ok2++;
assert(ok2 <= 1);
if (ok2)
return;
auto [ans1, l1] = getH(x, y, z, a, b, c);
auto [ans2, l2] = getH(y, z, x, b, c, a);
auto [ans3, l3] = getH(z, x, y, c, a, b);
assert(abs(l2 - l1) < EPS && abs(l3 - l1) < EPS);
cout << ans1 << " " << ans2 << " " << ans3 << "\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed << setprecision(7);
int t;
cin >> t;
while (t--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 4348kb
input:
2 1 1 1 1 1 1 2 3 3 1 1 1
output:
-0.8164966 -0.8164966 -0.8164966 -2.0000000 -2.8660254 -2.8660254
result:
ok 6 numbers
Test #2:
score: -100
Wrong Answer
time: 3ms
memory: 4104kb
input:
1000 21 2 14 12 13 4 29 19 13 15 10 17 29 24 15 29 24 23 29 17 30 18 9 25 27 24 30 16 4 15 28 13 17 12 21 16 16 22 10 22 15 8 15 23 24 23 27 13 26 3 27 15 16 17 5 8 20 17 6 12 24 14 13 15 19 13 27 22 18 18 23 30 22 18 14 11 29 28 7 13 22 22 17 11 19 9 16 22 20 17 21 14 20 6 29 25 20 10 19 9 27 27 17...
output:
-13.3523490 -2.9358567 -2.0000000 -12.2418267 -22.1464762 -16.0762047 -28.0274314 -18.3185826 -8.2433622 -27.2661197 -13.1593196 -26.8825254 -26.5349334 -22.0666321 -29.6160796 -26.9678045 -12.5576694 -14.1867221 -15.7785957 -20.8626769 -5.1558565 -10.9331000 -21.9155817 -17.7773984 -15.7407388 -18....
result:
wrong answer 1st numbers differ - expected: '-2.93586', found: '-13.35235', error = '3.54802'