求助50pts
查看原帖
求助50pts
549499
Disjoint_cat楼主2022/7/3 12:06

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;
}
2022/7/3 12:06
加载中...