- 三维偏序
1
- @ 2026-8-3 12:03:19
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
template<class T>
struct Fen {
int n;
vector<T> t;
Fen (int n_) {
init(n_);
}
Fen () {};
void init(int n_) {
n = n_;
t.assign(n + 1, {});
}
void change(int u, T x) {
for(; u <= n; u += u & -u) t[u] += x;
}
T sum(int u) {
T res = 0;
for(; u; u -= u & -u) res += t[u];
return res;
}
};
struct Node {
int a, b, c, i;
};
bool cmpa(const Node &a, const Node &b) {
return a.a < b.a;
}
bool cmpb(const Node &a, const Node &b) {
return a.b < b.b;
}
void solve() {
int n, N;
cin >> n >> N;
vector<Node> a(n);
vector<int> ans(n + 1);
for (int i = 1; i <= n; i++) {
int x, b, c; cin >> x >> b >> c;
a[i - 1] = {x, b, c, i};
}
sort(a.begin(), a.end(), cmpa);
Fen<int> t(N);
function<void(int, int)> cdq = [&] (int l, int r) {
if (l == r) return;
int m = l + r >> 1;
cdq(l, m); cdq(m + 1, r);
sort(a.begin() + l, a.begin() + m + 1, cmpb);
sort(a.begin() + m + 1, a.begin() + r + 1, cmpb);
vector<int> clr;
for (int j = m + 1, i = l; j <= r; j++) {
while (i <= m && a[i].b <= a[j].b) {
t.change(a[i].c, 1);
clr.push_back(a[i].c);
i++;
}
ans[a[j].i] += t.sum(a[j].c);
}
for (auto x : clr) t.change(x, -1);
int mn = N;
for (int i = m + 1; i <= r; i++) {
mn = min(mn, a[i].a);
}
clr.clear();
for (int i = l, j = m + 1; i <= m; i++) {
while (j <= r) {
if (a[j].a != mn) {
j++;
} else {
if (a[j].b <= a[i].b) {
t.change(a[j].c, 1);
clr.push_back(a[j].c);
j++;
} else {
break;
}
}
}
if (a[i].a == mn) {
ans[a[i].i] += t.sum(a[i].c);
}
}
for (auto x : clr) t.change(x, -1);
};
cdq(0, (int)a.size() - 1);
vector<int> d(n);
for (int i = 1; i <= n; i++) {
d[ans[i]]++;
}
for (auto x : d) cout << x << '\n';
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
/*
g++ -std=c++14 1.cpp -o 1 && 1 < in.txt > out.txt
g++ -std=c++17 1.cpp -o 1 && ./1 < in.txt > out.txt
*/
0 条评论
目前还没有评论...
信息
- ID
- 548
- 时间
- ms
- 内存
- MiB
- 难度
- 7
- 标签
- 递交数
- 12
- 已通过
- 8
- 上传者