rt,用的是cdq,为啥TLE5个点
#include<bits/stdc++.h>
#define lid id<<1
#define rid (lid)+1
#define mid (l+r>>1)
using namespace std;
const int N=100005,K=N<<1;
namespace sgt
{
struct tree
{
int l,r,sum;
}tr[K<<2];
void build(int l,int r,int id)
{
tr[id].l=l,tr[id].r=r,tr[id].sum=0;
if(l==r)return;
build(l,mid,lid);
build(mid+1,r,rid);
}
void mdf(int p,int v,int id)
{
tr[id].sum+=v;
if(tr[id].l==tr[id].r)return;
if(p<=tr[lid].r)mdf(p,v,lid);
else mdf(p,v,rid);
}
int query(int l,int r,int id)
{
if(r<l)return 0;
if(tr[id].l==l&&tr[id].r==r)return tr[id].sum;
if(tr[lid].r>=l)
{
if(tr[rid].l<=r)return query(l,tr[lid].r,lid)+query(tr[rid].l,r,rid);
else return query(l,r,lid);
}
else return query(l,r,rid);
}
}
struct node
{
int ans,a,b,c,cnt;
}a[N],b[N],a_[N];
bool cmp1(node a,node b)
{
return a.a<b.a||(a.a==b.a&&(a.b<b.b||(a.b==b.b&&a.c<b.c)));
}
bool cmp2(node a,node b)
{
return a.b<b.b||(a.b==b.b&&a.c<b.c);
}
int n,k,Ans[N],lst;
void sol(int l,int r)
{
if(l==r)return;
sol(l,mid);
sol(mid+1,r);
int i=l,j=mid+1;
//memcpy(a,b,sizeof(a));
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+mid+1,cmp2);
sort(b+mid+1,b+r+1,cmp2);
sgt::build(1,k,1);
for(int i=l,j=mid+1;j<=r;j++)
{
while(i<=mid&&b[i].b<=b[j].b)sgt::mdf(b[i++].c,b[i].cnt,1);
b[j].ans+=sgt::query(1,b[j].c,1);
}
for(int i=l;i<=r;i++)a[i]=b[i];
}
int main()
{
// freopen("P3810_1.in","r",stdin);
cin>>n>>k;
int n_=n;
n=lst=0;
for(int i=1;i<=n_;i++)scanf("%d%d%d",&a_[i].a,&a_[i].b,&a_[i].c);
sort(a_+1,a_+n_+1,cmp1);
for(int i=1;i<=n_;i++)
{
lst++;
if(a_[i].a!=a_[i+1].a||a_[i].b!=a_[i+1].b||a_[i].c!=a_[i+1].c)
a[++n]=a_[i],a[n].cnt=lst,lst=0;
}
sol(1,n);
// for(int i=1;i<=n;i++)printf("%d %d %d %d %d\n",a[i].a,a[i].b,a[i].c,a[i].ans,a[i].cnt);
for(int i=1;i<=n;i++)Ans[a[i].ans+a[i].cnt-1]+=a[i].cnt;
for(int i=0;i<n_;i++)printf("%d\n",Ans[i]);
return 0;
}