只有第一个点对了,但翻了翻题解感觉也没多少不一样的W_W。
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100;
int n,k,cnt,ans[N];
struct node{
int a,b,c,num;
}bb[N],a[N];
bool cmp1(node A,node B){
if(A.a!=B.a) return A.a<B.a;
if(A.b!=B.b) return A.b<B.b;
return A.c<B.c;
}
bool cmp2(node A,node B){
if(A.b!=B.b) return A.b<B.b;
else return A.c<B.c;
}
int c[N];
int lowbit(int x){return x&(-x);}
void add(int x,int val){for(;x<=k;x+=lowbit(x))c[x]+=val;}
int sum(int x){int res=0;for(;x>0;x-=lowbit(x))res+=c[x];return res;}
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+1+mid,cmp2);
sort(a+mid+1,a+1+r,cmp2);
int j=l;
for(int i=mid+1;i<=r;i++){
while(a[i].b>=a[j].b and j<=mid){
add(a[j].c,a[j].num);
j++;
}
ans[i]+=sum(a[i].c);
}
for(int i=l;i<j;i++) add(a[i].c,-a[i].num);
}
int number[N];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) scanf("%d%d%d",&bb[i].a,&bb[i].b,&bb[i].c),bb[i].num=1;
sort(bb+1,bb+1+n,cmp1);
for(int i=1;i<=n;i++){
if(i==1 or bb[i-1].a!=bb[i].a or bb[i-1].b!=bb[i].b or bb[i-1].c!=bb[i].c) a[++cnt]=bb[i];
else a[cnt].num++;
}
cdq(1,cnt);
for(int i=1;i<=cnt;i++) number[ans[i]+a[i].num-1]+=a[i].num;
for(int i=0;i<n;i++) cout<<number[i]<<endl;
}