CDQ分治求调
查看原帖
CDQ分治求调
378346
expnoi楼主2023/3/16 08:19
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int s=0,w=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+(c^48),c=getchar();
	return s*w;
}
inline void print(int x)
{
	if(x<0)x=-x,putchar('-');
	if(x>=10)print(x/10);
	putchar(x%10+48);
}
int n,k,m,C[1000010],f[1000010];
inline int lowbit(int x)
{
	return x&(-x);
}
struct node{
	int a,b,c,cnt,ans;
}a[1000010],w[1000010];
bool cmp(node a,node b)
{
	if(a.a==b.a)
	{
		if(a.b==b.b)return a.c<b.c;
		return a.b<b.b;
	}
	return a.a<b.a;
}
bool cmp1(node a,node b)
{
	if(a.b==b.b)return a.c<b.c;
	return a.b<b.b;
}
inline void update(int x,int v){
	while(x<=k)
	{
	//	cout<<x<<"\n";
		C[x]+=v;
		x+=lowbit(x);
	}
}
inline int query(int x)
{
	int res=0;
	while(x)
	{
		res+=C[x];
		x-=lowbit(x);
	}
	return res;
}
inline void CDQ(int l,int r){
	if(l==r)return;
	int mid=l+r>>1;
	CDQ(l,mid);
	CDQ(mid+1,r);
	sort(w+l,w+mid+1,cmp1);
	sort(w+mid+1,w+r+1,cmp1);
	int j=l;//[l,j)已经跑过。 
	for(int i=mid+1;i<=r;i++)
	{
//		cout<<i<<' ';
		while(w[i].b>=w[j].b&&j<=mid)
		{
			//cout<<j<<' '<<w[j].c<<" "<<w[j].cnt<<'\n';
			update(w[j].c,w[j].cnt);
			j++;
		}
		w[i].ans+=query(w[i].c);
	}
	for(int i=l;i<j;i++)update(w[i].c,-w[i].cnt);
}
signed main()
{
	n=read();
	k=read();
	for(int i=1;i<=n;i++)
	{
		a[i]={read(),read(),read()};
	}
	sort(a+1,a+n+1,cmp);
	m=0;
	int cou=0;
	for(int i=1;i<=n;i++)
	{
		cou++;
		if(a[i].a!=a[i-1].a||a[i].b!=a[i-1].b||a[i].c!=a[i-1].c)
		{
			m++;
			w[i]=a[i];
			w[i].cnt=cou;
			cou=0;
		}
	}
	n=m;
	CDQ(1,n);
	for(int i=1;i<=n;i++)
	{
		f[w[i].ans+w[i].cnt-1]+=w[i].cnt;
	}
	for(int i=0;i<n;i++)
	{
		print(f[i]);
		puts("");
	}
}

似乎是update里面死循环了,但不知道死循环原因/kk

2023/3/16 08:19
加载中...