为了防止有人说马蜂问题,可以看这个
```
#include <iostream>
#include <algorithm>
using namespace std;
struct TLEWA {
int a, b, c, v, id;
}
a[1000005], b[1000005];
int f[1000005], ans[1000005];
long long pref[1000005]
;
void addd(int x, long long v) {
for (int j=x; j<=1000000; j+=j&-j) pref[j] += v;
}
long long query(int x) {
long long summ=0;
for (int j=x; j; j-=j&-j) summ += pref[j];
return summ;
}
void seele(int l, int r) {
if (l == r) return;
int mid = (l + r) / 2;
seele(l, mid);
seele(mid+1, r);
sort(b+l, b+r+1, [](TLEWA x, TLEWA y) {
return x.b < y.b;
}
);
for (int i=l; i<=r; i++) if (b[i].id <= mid) addd(b[i].c, b[i].v); else f[b[i].id] += query(b[i].c);
for (int i=l; i<=r; i++) if (b[i].id <= mid) addd(b[i].c, -b[i].v);
}
int main() {
int n, k, cnt=0;
cin >> n >> k;
for (int i=1; i<=n; i++) cin >> a[i].a >> a[i].b >> a[i].c;
sort(a+1, a+1+n, [](TLEWA x, TLEWA y) {
return x.a != y.a ? x.a < y.a : (x.b != y.b ? x.b < y.b : x.c < y.c);
}
);
for (int i=1; i<=n; i++) if (a[i].a != a[i-1].a || a[i].b != a[i-1].b || a[i].c != a[i-1].c) b[++cnt] = a[i], b[cnt].id = cnt, b[cnt].v = 1; else b[cnt].v++;
seele(1, cnt);
for (int i=1; i<=cnt; i++) ans[f[i]]++;
for (int i=0; i<n; i++) cout << ans[i] << endl;
}
```
by LuoTianyi_Official @ 2023-10-31 14:12:27
你这个代码好像不能处理
```
1 1 1
1 1 1
1 1 1
```
这样三个点一起的吧
by xyzfrozen @ 2023-10-31 14:16:45
@[LuoTianyi_Official](/user/424089) 楼上正解。
如果多个点叠在一起,那么显然它们互相满足条件,并且也应当当作多个点来加,而不是一个。
所以统计答案时 `for (int i=1; i<=cnt; i++) ans[f[i]]++;` 应该改成 `for (int i = 1; i <= cnt; ++i) ans[f[b[i].id] + b[i].v - 1] += b[i].v;`
by ATZdhjeb @ 2023-10-31 14:37:34
~~以及你谷怎么两个天依~~
by ATZdhjeb @ 2023-10-31 14:38:29
@[xyzfrozen](/user/749714) @[ATZdhjeb](/user/483317) 谢谢。我的代码还有一个问题是排序需要按照 c 和 a 作为第二和第三关键字排序。现在过了。
~~我是洛谷的洛天依唯一官方号。其他洛天依都是高仿我的。~~
by LuoTianyi_Official @ 2023-10-31 16:04:43