首页 > 其他分享 >三维偏序

三维偏序

时间:2024-04-25 13:22:18浏览次数:19  
标签:偏序 struct int 分治 三维 mid cdq rm

cdq 分治:

一个长度为 \(n\) 的序列,统计有一些特性的点对 \((i,j)\) 的数量/找到一对点 \((i,j)\) 使得一些函数的值最大。对于这一类问题,我们考虑使用 \(\rm cdq\) 分治思想来解决。

  • 什么是 \(\rm cdq\) 分治思想?

\(\rm cdq\) 解决这种问题所使用的是分治思想,但却有些不同,具体流程如下:

  • 假设我们现在要求的是 \([l,r]\) 这个区间的所有点对所对应的答案。

  • 令中点 \(mid=(l+r)/2\)

  • 将点对分为三类:

    1.\(x\) 和 \(y\) 均在 \([l,mid]\) 中的 \((x,y)\) 点对

    2.\(x\) 在 \([l,mid]\) 中,\(y\) 在 \([mid+1,r]\) 中的 \((x,y)\) 点对

    3.\(x\) 和 \(y\) 均在 \([mid+1,r]\) 的 \((x,y)\) 的点对

  • 此时对 1、3 类点对进行递归计算,并设法求出第 2 种点对的答案。

Solution:

回到 P3810 【模板】三维偏序 中,在本题中 \(\rm cdq\) 分治思想如何应用?

首先简化一下问题,将点按 \(a\) 排序,此时已经满足了第一个条件。

那么我们考虑在 \(\rm cdq\) 过程中第三种点对如何去求。

此时我们为了方便处理,对左右两半分别按 \(b\) 从小到大进行归并排序。

维护两个指针 \(i\) 和 \(j\) 分别是 \([l,mid]\) 和 \([mid+1,r]\) 归并到哪,同时维护一颗权值树状数组。比较 \(i\) 和 \(j\) 两点 \(b\) 的大小并插入,假如此时我们插入的是 \(i\)。 那么我们更新 \(p[i].c\) 。否则我们可以直接前缀和统计答案。

记得去重。

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+10;
int n,m;
struct point{
	int x,y,z;
	int cnt,ans;
}p[N],tmp[N];

struct BIT{
	int t[N<<1];
	int lowbit(int x){return x&-x;}
	void add(int x,int k){
		while(x<=m){
			t[x]+=k;
			x+=lowbit(x);
		}
		return;
	}
	int sum(int x){
		int ret=0;
		while(x>0){
			ret+=t[x];
			x-=lowbit(x);
		}
		return ret;
	}
}tree;

bool cmp(struct point p1,struct point p2){
	if(p1.x!=p2.x)return p1.x<p2.x;
	if(p1.y!=p2.y)return p1.y<p2.y;
	return p1.z<p2.z;
}
void cdq(int l,int r){
	if(l>=r)return;
	int mid=(l+r>>1);
	cdq(l,mid);cdq(mid+1,r);
	int cnt=0;
	int i=l,j=mid+1;
	while(i<=mid&&j<=r){
		if(p[i].y<=p[j].y)tree.add(p[i].z,p[i].cnt),tmp[++cnt]=p[i++];
		else{
			p[j].ans+=tree.sum(p[j].z);
			tmp[++cnt]=p[j++];
		}
	}
	while(i<=mid)tree.add(p[i].z,p[i].cnt),tmp[++cnt]=p[i++];
	while(j<=r)p[j].ans+=tree.sum(p[j].z),tmp[++cnt]=p[j++];
	for(int i=l;i<=mid;i++)tree.add(p[i].z,-p[i].cnt);
	for(int i=l;i<=r;i++)p[i]=tmp[i-l+1];
	return;
}

int res[N];

signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y>>p[i].z,p[i].cnt=1;
	sort(p+1,p+n+1,cmp);
	int tmpcnt=1;
	for(int i=2;i<=n;i++){
		if(p[i].x==p[tmpcnt].x&&p[i].y==p[tmpcnt].y&&p[i].z==p[tmpcnt].z){
			p[tmpcnt].cnt++;
			continue;
		}
		p[++tmpcnt]=p[i];
	}
	cdq(1,tmpcnt);
	//for(int i=1;i<=n;i++)cout<<p[i].x<<" "<<p[i].y<<" "<<p[i].z<<" "<<f[i]<<" "<<p[i].cnt<<endl;
	for(int i=1;i<=tmpcnt;i++)res[p[i].ans+p[i].cnt-1]+=p[i].cnt;
	for(int i=0;i<n;i++)cout<<res[i]<<"\n";
	
	return 0;
}

标签:偏序,struct,int,分治,三维,mid,cdq,rm
From: https://www.cnblogs.com/little-corn/p/18157476

相关文章

  • 实景三维技术在应急管理与防灾减灾领域的应用
    随着科技的快速发展,实景三维技术以其独特的优势,在应急管理与防灾减灾领域逐渐展现出其巨大的应用价值。实景三维技术通过高精度的三维建模,将现实世界中的物体、场景以数字化的形式进行呈现,为应急管理与防灾减灾提供了全新的视角和手段。一、实景三维技术的原理与特点实景三维技术......
  • 计算机图形:三维观察之投影变换
    目录投影变换正投影轴测、等轴测正投影正投影坐标系裁剪窗口、正投影观察体正投影的规范化变换斜投影斜*行投影斜等测、斜二测*行投影斜*行投影变换透视投影投影参考点与观察原点坐标变换特殊透视投影灭点灭点与投影参考点透视投影观察体透视投影变换矩阵对称透视投影椎体斜透视投......
  • 沉浸式观赛新风尚:足球场体育馆三维可视化技术引领潮流
    在数字化浪潮席卷全球的今天,三维可视化技术正以其独特的魅力引领着体育场馆建设的革新潮流。这一技术的出现,不仅为观众带来了前所未有的视觉享受,更在体育产业的发展中,开启了一扇通往未来的大门。 足球场体育馆三维可视化,就是将足球场体育馆的实体结构通过三维建模技术,以数字化......
  • 倾斜摄影三维模型数据在立面出图应用分析
    倾斜摄影三维模型数据在立面出图应用分析  倾斜摄影是一种高精度、高效率的三维数据采集技术,通过倾斜摄影系统获取的数据可以生成真实的、具有几何形状和纹理信息的三维模型。在建筑设计、城市规划、土地管理等领域,立面出图是一项重要的应用,可以用于建筑外观展示、立面......
  • 倾斜摄影三维模型数据在立体裁剪应用分析
    倾斜摄影三维模型数据在立体裁剪应用分析 立体裁剪是一种将三维模型应用于摄影中的技术,可以在摄影过程中将虚拟的三维模型与现实场景进行合成,从而实现逼真的视觉效果。倾斜摄影是一种通过无人机或其他飞行器进行航拍的技术,可以获取到大范围的地理数据,包括地面的高程、建筑物的......
  • vue 高德地图 三维切换为二维
    在Vue中使用高德地图进行三维与二维视图的切换,可以通过操作地图实例的setMapType方法来完成。以下是一个简单的示例:首先确保安装并导入了高德地图的JavaScriptAPI。在Vue组件中,初始化高德地图,并创建地图实例。使用一个方法来切换地图的视图模式。<template><divid="map"......
  • 基于三维地图开发的智慧展馆可视化系统建设方案有何推荐?
    基于三维地图开发的智慧展馆可视化系统建设方案有何推荐?     关注者7被浏览10,520关注问题​写回答​邀请回答​好问题​添加评论​分享​  查看全部5个回答粉刷匠 ​ 关注  1人赞同了......
  • 如何实现超大场景三维模型数据模型调色
    如何实现超大场景三维模型数据模型调色 超大场景三维模型数据模型调色是指对于大规模的三维模型,通过对其进行色彩调整以实现更好的视觉效果和表达。下面将介绍如何实现超大场景三维模型数据模型调色的方法。 首先,为了实现超大场景三维模型数据模型调色,需要使用专业的......
  • 实景三维技术在社区服务与管理领域的应用
    随着科技的不断发展,实景三维技术已经成为了社区服务与管理领域的一项重要工具。实景三维技术可以通过高精度的三维建模技术,将现实世界中的场景、物体以及人物进行数字化重建,使得人们可以在计算机中实现对现实世界的全方位、多角度的观察和分析。在社区服务与管理领域,实景三维技......
  • 实景三维技术在公共安全领域的应用
    随着科技的不断发展,实景三维技术在公共安全领域的应用越来越广泛。实景三维技术是指通过采集现实世界的三维数据,构建出真实的三维场景,进而实现对现实世界的数字化模拟和重建。在公共安全领域,实景三维技术的应用不仅可以提高安全管理的效率和精度,还可以为应急处置和救援提供有力的......