#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5,M = 2e5 + 5,maxn = 2e5;
int n,m;
struct Tuple { int a,b,c,ans = 0,cnt = 0,id; } r[N],A[N];
bool cmpA(Tuple x,Tuple y)
{
return x.a == y.a? (x.b == y.b? x.c < y.c : x.b < y.b) : x.a < y.a;
}
bool cmpB(Tuple x,Tuple y) { return x.b == y.b? x.c < y.c : x.b < y.b; }
struct BIT
{
int t[M] = {};
inline int lowbit(int x) { return x & (-x); }
inline void add(int x,int v) { while(x <= m) t[x] += v,x += lowbit(x); }
inline int query(int x) { int sum = 0; while(x) sum += t[x],x -= lowbit(x); return sum; }
}T;
int ans[N],cnt[N];
void CDQ(int l,int r)
{
if(l >= r) return;
int mid = (l + r) >> 1;
CDQ(l,mid); CDQ(mid + 1,r);
sort(A + l,A + mid + 1,cmpB);
sort(A + mid + 1,A + r + 1,cmpB);
int j = l; multiset<int> S1,S2;
for(int i = mid + 1; i <= r; i++)
{
while(j <= mid && A[j].b <= A[i].b) T.add(A[j].c,A[j].cnt),j++;
A[i].ans += T.query(A[i].c);
}
for(int i = l; i < j; i++) T.add(A[i].c,-A[i].cnt);
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> r[i].a >> r[i].b >> r[i].c,r[i].cnt = 1;
sort(r + 1,r + n + 1,cmpA);
int p = 0;
for(int i = 1; i <= n; i++)
{
if(r[i].a != r[i - 1].a || r[i].b != r[i - 1].b || r[i].c != r[i - 1].c)
A[++p] = r[i],A[p].cnt = 1,A[p].id = p;
else A[p].cnt++;
}
CDQ(1,p);
// for(int i = 1; i <= p; i++) ans[A[i].id] = A[i].ans;
// for(int i = 1; i <= p; i++) cout << ans[i] << endl;
for(int i = 1; i <= p; i++) cnt[A[i].ans + A[i].cnt - 1] += A[i].cnt;
for(int i = 0; i < n; i++) cout << cnt[i] << endl;
return 0;
}
把高亮行:
while(j <= mid && A[j].b <= A[i].b) T.add(A[j].c,A[j].cnt),j++;
改作
while(j <= mid && A[j].b <= A[i].b) T.add(A[j].c,A[j++].cnt);
会WA+RE0pts,着实奇怪
有没有大佬为本蒟蒻答疑