ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LG3810 【模板】三维偏序

2021-12-20 20:35:09  阅读:120  来源: 互联网

标签:偏序 sort ch int cmpy mid LG3810 include 模板


本来就是很模板的题了,什么时候把题解补上

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100005;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||'9'<ch){if(ch=='-')f=-1;ch=getchar();}
	while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
struct node{int x,y,z,id,num,ans;}a[N],b[N];
inline bool cmpx(node x,node y){
	if(x.x==y.x)
		return x.y==y.y?x.z<y.z:x.y<y.y;
	return x.x<y.x;
}
inline bool cmpy(node x,node y){
	if(x.y==y.y)
		return x.z<y.z;
	return x.y<y.y;
}
int n,k,tot,bot[N],c[N];
inline int lowbit(int x){return x&-x;}
inline void update(int i,int v){for(;i<=k;i+=lowbit(i))c[i]+=v;}
inline int getsum(int i){int ans=0;for(;i;i-=lowbit(i))ans+=c[i];return ans;}
void CDQ(int l,int r){//按横坐标排好序之后再进行分治就只需要考虑y,z的情况了
	if(l==r)return;
	int mid=(l+r)>>1,i=l,j=mid+1;
	CDQ(l,mid);CDQ(mid+1,r);
	sort(a+l,a+mid+1,cmpy);
	sort(a+mid+1,a+r+1,cmpy);
	for(;j<=r;++j){//利用双指针,满足y的情况
		while(a[i].y<=a[j].y&&i<=mid)
			update(a[i].z,a[i].num),++i;
		a[j].ans+=getsum(a[j].z);//利用树状数组统计z满足的数的数量
	}
	for(int loc=l;loc<i;++loc)//只能清空对树状数组有共享的位置
		update(a[loc].z,-a[loc].num);
}//只需要考虑分治左边的数对右边的数的共享,分治右边的数自然也可以通过内部的分治来解决
int main(){
	n=read(),k=read();
	for(int i=1;i<=n;++i){
		b[i].x=read(),b[i].y=read(),b[i].z=read();
	}sort(b+1,b+1+n,cmpx);
	int tmp=0;
	for(int i=1;i<=n;++i){
		++tmp;//去重
		if(b[i].x!=b[i+1].x||b[i].y!=b[i+1].y||b[i].z!=b[i+1].z)
			a[++tot]=b[i],a[tot].num=tmp,tmp=0;
	}
	/*for(int i=1;i<=tot;++i)
		printf("%d %d %d %d\n",a[i].x,a[i].y,a[i].z,a[i].num);*/
	CDQ(1,tot);
	for(int i=1;i<=tot;++i)
		bot[a[i].ans+a[i].num-1]+=a[i].num;//相同的数可以认为满足偏序
	for(int i=0;i<n;++i)//显然只能到n-1
		printf("%d\n",bot[i]);
	return 0;
}// 613ms /  5.27MB /  1.54KB C++14 O2

标签:偏序,sort,ch,int,cmpy,mid,LG3810,include,模板
来源: https://www.cnblogs.com/BigSmall-En/p/15712762.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有