四维偏序

题意:

给定n个元素,每个元素有四个属性a,b,c,d,求序列中满足ai<ajbi<bjci<cjdi<dj的数对(i,j)的个数。

对于100的数据,1<=n<=50000,保证所有的ai,bi,ci,di分别组成四个1~n的排列。

思路:

第一维排序。
第二维cdq分治,在保持第二维有序的情况下,记录第一维的顺序(即此元素是否可以更新其他元素或是否可以被更新)
第三维继续cdq分治,维持第三维有序性
第四维在以上的前提下,用树状数组维护统计答案

注意事项:

谨防手残

code:

#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int n,ans;
struct node{int a,b,c,d,tp;}q[N],tmp1[N],tmp2[N];
inline bool cmp1(node x,node y){return x.a<y.a;}
inline int read()
{
	int s=0,w=1; char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')w=-1;
	for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
	return s*w;
}
struct tree{
	int cc[N];
	inline int lowbit(int x){return x&(-x);}
	inline void add(int x,int v)
	{
		for(;x<=n;x+=lowbit(x))cc[x]+=v;
	}
	inline int query(int x)
	{
		int anss=0;
		for(;x;x-=lowbit(x))anss+=cc[x];
		return anss;
	}
}T;
void cdq3d(int l,int r)
{
	if(l==r) return;
	int mid=l+r>>1;
	cdq3d(l,mid);cdq3d(mid+1,r);
	int i=l,j=mid+1,cnt2=l;
	while(j<=r)
	{
		while(tmp1[i].c<tmp1[j].c&&i<=mid)
		{
			if(tmp1[i].tp==1) T.add(tmp1[i].d,1);
			tmp2[cnt2++]=tmp1[i++];
		}
		if(tmp1[j].tp==2) ans+=T.query(tmp1[j].d);
		tmp2[cnt2++]=tmp1[j++];
	}
	for(int e=l;e<i;++e)
		if(tmp1[e].tp==1) T.add(tmp1[e].d,-1);
	for(int e=i;e<=mid;++e) tmp2[cnt2++]=tmp1[e];
	for(int e=l;e<=r;++e) tmp1[e]=tmp2[e];
}
void cdq2d(int l,int r)
{
	if(l==r) return;
	int mid=l+r>>1;
	cdq2d(l,mid);cdq2d(mid+1,r);
	int i=l,j=mid+1,cnt1=l;
	while(j<=r)
	{
		while(q[i].b<q[j].b&&i<=mid) q[i].tp=1,tmp1[cnt1++]=q[i++];
		q[j].tp=2,tmp1[cnt1++]=q[j++];
	}
	for(int e=i;e<=mid;++e) q[e].tp=1,tmp1[cnt1++]=q[e];
	for(int e=l;e<=r;++e) q[e]=tmp1[e];
	cdq3d(l,r);
}
int main()
{
	n=read();
	for(int i=1;i<=n;++i)q[i].a=read();
	for(int i=1;i<=n;++i)q[i].b=read();
	for(int i=1;i<=n;++i)q[i].c=read();
	for(int i=1;i<=n;++i)q[i].d=read();
	sort(q+1,q+n+1,cmp1);
	cdq2d(1,n);
	cout<<ans;
	return 0;
}
posted @   BILL666  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示