/*
测测你的三维数点3
时间限制: 5 s
空间限制: 2097152 KB
题目描述
三维空间中有 n 个点,每个点分别具有 [0, n) 整数范围的 x 坐标、y 坐标和 z 坐标(不同点的各维坐标值可能重复,即可能存在 x[i] == x[j] 或 y[i] == y[j] 或 z[i] == z[j])。你需要对每个点,统计每维坐标均小于该点对应维坐标的点的个数。
接口
void count_3d(int n, const unsigned *x, const unsigned *y, const unsigned *z, unsigned *out);
其中,第 i (0 <= i < n) 个点的坐标为 (x[i], y[i], z[i]),其统计结果需要保存到 out[i]。
数据范围
n 等于 10,000
*/
#include <algorithm>
#include <tuple>
#include <vector>
using namespace std;
void count_3d(int n, const unsigned *x, const unsigned *y, const unsigned *z, unsigned *out) {
vector<tuple<unsigned, unsigned, unsigned, int>> v;
v.reserve(n);
for (int i = 0; i < n; i++)
v.emplace_back(x[i], y[i], z[i], i);
sort(v.begin(), v.end());
vector<tuple<unsigned, unsigned, unsigned>> a;
a.reserve(n);
for (int i = 0; i < n; i++)
a.emplace_back(get<0>(v[i]), get<1>(v[i]), get<2>(v[i]));
vector<int> b;
b.reserve(n);
for (int i = 0; i < n; i++) {
int ans = 0;
int k = i;
while (k >= 0 && get<0>(a[k]) == get<0>(a[i]))
k--;
for (int j = 0; j <= k; j++) {
if (get<1>(a[j]) < get<1>(a[i]) && get<2>(a[j]) < get<2>(a[i]))
ans++;
}
b.push_back(ans);
}
for (int i = 0; i < n; i++)
out[get<3>(v[i])] = b[i];
}
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Testcase #1 | 177.317 ms | 368 KB | Accepted | Score: 100 | 显示更多 |