QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#566930 | #9316. Boxes | shiqiaqiaya | WA | 1ms | 3876kb | C++20 | 3.8kb | 2024-09-16 03:47:11 | 2024-09-16 03:47:12 |
Judging History
answer
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // 包含 tree、gp_hash_table、cc_hash_table
#include <ext/pb_ds/priority_queue.hpp> // 引入后使用 STL 的堆需要 std::
#include <ext/rope>
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;
template<class key, class val = null_type, class cmp = less<>>
using rb_tree = tree<key, val, cmp, rb_tree_tag, tree_order_statistics_node_update>;
template<class key, class cmp = less<>>
using pairing_heap = __gnu_pbds::priority_queue<key, cmp>;
typedef long long ll;
#define int long long
mt19937_64 rd(time(0));
using type = int;
struct point : array<type, 3> {
point operator * (const point & t) const { return {at(1) * t[2] - at(2) * t[1], at(2) * t[0] - at(0) * t[2], at(0) * t[1] - at(1) * t[0]}; }
type operator / (const point & t) const { return at(0) * t[0] + at(1) * t[1] + at(2) * t[2]; }
point & operator += (const point & t) { return at(0) += t[0], at(1) += t[1], at(2) += t[2], *this; }
point operator + (const point & t) const { return point(*this) += t; }
point & operator -= (const point & t) { return at(0) -= t[0], at(1) -= t[1], at(2) -= t[2], *this; }
point operator - (const point & t) const { return point(*this) -= t; }
point & operator *= (const type & t) { return at(0) *= t, at(1) *= t, at(2) *= t, *this; }
point operator * (const type & t) const { return point(*this) *= t; }
point & operator /= (const type & t) { return at(0) /= t, at(1) /= t, at(2) /= t, *this; }
point operator / (const type & t) const { return point(*this) /= t; }
void shake(double eps = 1e-10) {
for (auto & t : *this) {
t += ((double)rand() / RAND_MAX - 0.5) * eps;
}
}
};
struct face {
array<int, 3> v;
point p, norm;
bool above(const point & t) {
return (t - p) / norm > 0;
}
};
static vector<face> hull(vector<point> & q, vector<face> res = {}) {
vector g(q.size(), vector<int>(q.size()));
res.emplace_back(face{0, 1, 2, q[0], (q[1] - q[0]) * (q[2] - q[0])});
res.emplace_back(face{2, 1, 0, q[2], (q[1] - q[2]) * (q[0] - q[2])});
for (int i = 3; i < q.size(); i++) {
vector<face> nf;
for (auto & x : res) {
int t = x.above(q[i]);
if (!t) nf.emplace_back(x);
for (int k = 0; k < 3; k++) {
int a = x.v[k], b = x.v[(k + 1) % 3];
g[a][b] = t;
}
}
for (auto & x : res) {
for (int k = 0; k < 3; k++) {
int a = x.v[k], b = x.v[(k + 1) % 3];
if (g[a][b] && !g[b][a]) {
nf.emplace_back(face{a, b, i, q[a], (q[b] - q[a]) * (q[i] - q[a])});
}
}
}
swap(res, nf);
}
return res;
}
void QAQ() {
int n;
cin >> n;
vector<point> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i][0] >> a[i][1] >> a[i][2];
}
__int128 ans = 0;
while (a.size() > 3) {
shuffle(a.begin(), a.end(), rd);
vector<int> vis(a.size());
auto res = hull(a);
for (auto & x : res) {
(ans += a[x.v[0]] * a[x.v[1]] / a[x.v[2]]);
for (auto & idx : x.v) {
vis[idx] = 1;
}
}
vector<point> ta;
for (int i = 0; i < a.size(); i++) {
if (!vis[i]) {
ta.push_back(a[i]);
}
}
swap(ta, a);
}
auto out = [&](auto && self, __int128 t) {
if (t == 0) return;
self(self, t / 10);
cout << (int)(t % 10);
};
out(out, ans);
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
cout << fixed << setprecision(3);
int t = 1;
cin >> t;
while (t--) {
QAQ();
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3876kb
input:
2 4 0 0 1 0 0 2 0 1 1 1 1 1 10 2 6 3 2 9 0 2 1 0 3 7 3 0 5 6 10 9 2 4 4 2 8 5 2 4 6 9 6 7 5
output:
1943
result:
wrong answer 1st lines differ - expected: '1', found: '1943'