当前位置: 首页 > news >正文

cdq+bitset处理高维偏序

高维偏序

CDQ分治

假设处理的区间为 [ l , r ] [l,r] [l,r] ,CDQ分治的过程:

  1. 如果 l ≥ r l\geq r lr ,返回。
  2. 设区间中点为 m i d mid mid ,递归处理 [ l , m i d ] [l,mid] [l,mid] [ m i d + 1 , r ] [mid+1,r] [mid+1,r]
  3. 利用单调性处理横跨 m i d mid mid 的点对,不横跨 m i d mid mid 的点对将在递归中被解决。

bitset

定义 bitset<maxn>a[i][j] 代表第 i i i 个数在第 j j j 个属性上与其他元素的大小关系。

如果 a [ i ] [ j ] [ k ] = 1 a[i][j][k]=1 a[i][j][k]=1 ,代表第 i i i 个数在第 j j j 个属性上大于等于第 k k k 个数,即 v [ i ] [ j ] ≥ v [ k ] [ j ] v[i][j] \geq v[k][j] v[i][j]v[k][j]

怎么去求解呢,只需要对每个属性进行排序,从小到大遍历,每次在 b i t s e t bitset bitset 这个位置上 s e t set set 1 1 1,然后每次让对应的 a [ i d ] [ j ] = t m p a[id][j]=tmp a[id][j]=tmp 即可。

那么第 i i i 个数在第 j j j 个属性上大于等于其他数的个数即为 a [ i ] [ j ] . c o u n t ( ) a[i][j].count() a[i][j].count()

所有属性都大于等于的个数,那么就是按位与之后的 c o u n t count count

P3810 【模板】三维偏序(陌上花开)

cdq思路:

只需要解决如何求横跨 m i d mid mid 的点对,先按 a a a 属性排序,那么 [ l , m i d ] . a < [ m i d + 1 , r ] . a [l,mid].a<[mid+1,r].a [l,mid].a<[mid+1,r].a

然后我们再对 [ l , m i d ] , [ m i d + 1 , r ] [l,mid],[mid+1,r] [l,mid],[mid+1,r] b b b 属性分别排序(保证了 a a a 属性的顺序),然后 c c c 属性的话按照双指针+树状数组即可统计。

需要注意的是,会有三个属性相同的情况需要特殊处理。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
//#include<random>
//#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define node array<int,5>
#define pii pair<int,int>
#define lowbit(x) x&-x
array<int,200020>c;
struct Tree{void add(int i,int x){for(;i<=200000;i+=lowbit(i))c[i]+=x;}int sum(int i){int ans=0;for(;i;i-=lowbit(i))ans+=c[i];return ans;}
}T;
vector<node>a;
int ans[200020];
int cnt[200020];
void cdq(int l,int r){if(l>=r)return ;int mid=l+r>>1;cdq(l,mid);cdq(mid+1,r);sort(a.begin()+l,a.begin()+mid+1,[](node x,node y){if(x[2]!=y[2])return x[2]<y[2];return x[3]<y[3];});sort(a.begin()+mid+1,a.begin()+r+1,[](node x,node y){if(x[2]!=y[2])return x[2]<y[2];return x[3]<y[3];});int L=l;for(int i=mid+1;i<=r;i++){while(L<=mid&&a[L][2]<=a[i][2])T.add(a[L][3],a[L][4]),L++;ans[a[i][0]]+=T.sum(a[i][3]);}for(int i=l;i<L;i++){T.add(a[i][3],-a[i][4]);}
}
void solve(){int n,k;cin>>n>>k;int tn=n;a=vector<node>(n+1);for(int i=1;i<=n;i++){cin>>a[i][1]>>a[i][2]>>a[i][3];a[i][4]=1;// a[i][0]=i;}sort(a.begin()+1,a.end(),[](node x,node y){if(x[1]!=y[1])return x[1]<y[1];if(x[2]!=y[2])return x[2]<y[2];return x[3]<y[3];});vector<node>b;b.push_back({0,0,0,0,0});for(int i=2;i<=n;i++){if(a[i][1]==a[i-1][1]&&a[i][2]==a[i-1][2]&&a[i][3]==a[i-1][3]){a[i][4]+=a[i-1][4];}else {b.push_back(a[i-1]);}}b.push_back(a[n]);a=b;n=a.size()-1;for(int i=1;i<=n;i++){a[i][0]=i;ans[i]+=a[i][4]-1;}cdq(1,n);for(int i=1;i<=n;++i){cnt[ans[a[i][0]]]+=a[i][4];}for(int i=0;i<tn;i++)cout<<cnt[i]<<'\n';
}   
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t=1;// cin>>t;while(t--)solve();return 0;
}

bitset思路:

需要用到分块,以时间换空间。需要处理同一个属性相同的数。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<bitset>
//#include<random>
//#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
bitset<100020>a[8010];
int s[5][100020];
int p[5][100020];
void solve(){int n,K;cin>>n>>K;for(int i=1;i<=n;i++){for(int j=1;j<=3;j++){cin>>s[j][i];}}for(int i=1;i<=n;i++)for(int j=1;j<=3;j++)p[j][i]=i;for(int j=1;j<=3;j++){sort(p[j]+1,p[j]+1+n,[&](int x,int y){return s[j][x]<s[j][y];});}vector<int>ans(n+1,0),cnt(n+1,0);for(int q=1;q<=n;q+=8000){int P=q-1,len=min(8000,n-q+1);for(int i=1;i<=len;i++)a[i].set();for(int j=1;j<=3;j++){bitset<100020>b;b.reset();for(int i=1;i<=n;i++){int k=i;for(k=i;k<=n&&s[j][p[j][i]]==s[j][p[j][k]];k++){b.set(p[j][k]);}for(k=i;k<=n&&s[j][p[j][i]]==s[j][p[j][k]];k++){if(p[j][k]>P&&p[j][k]<=P+len)a[p[j][k]-P]&=b;}i=k-1;}}for(int i=1;i<=len;i++)ans[a[i].count()-1]++;}// for(int i=1;i<=n;i++)ans[cnt[i]]++;for(int i=0;i<n;i++)cout<<ans[i]<<'\n';
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t=1;// cin>>t;while(t--)solve();return 0;
}

相关文章:

cdq+bitset处理高维偏序

高维偏序 CDQ分治 假设处理的区间为 [ l , r ] [l,r] [l,r] &#xff0c;CDQ分治的过程&#xff1a; 如果 l ≥ r l\geq r l≥r &#xff0c;返回。设区间中点为 m i d mid mid &#xff0c;递归处理 [ l , m i d ] [l,mid] [l,mid] 和 [ m i d 1 , r ] [mid1,r] [mid…...

敏捷开发和传统开发,你更适合哪种?

时间&#xff1a;2024年 10月 03日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频&#xff1a;喜马拉雅 大家好&#xff0c;欢迎来到“小蒋聊技术”&#xff0c;我是小蒋&#xff01;今天我们来聊聊两个开发模式的“对决”…...

python之with

with上下文管理是什么呢&#xff1f; 一般都是使用系统提供的一些with语句&#xff0c;列如我要去读取一些数据进行分析&#xff0c;就可以使用with open去读取某些数据&#xff0c;或者我要把一些图片给他保存到某些地方&#xff0c;可以用with给他写入。 上下午管理器with是…...

vue3 升级实战笔记

最近要将公司项目的移动端进行 vue3 的升级工作&#xff0c;就顺便记录下升级过程。 项目迁移的思路 我的想法是最小改动原则。 从 vue2.x 升级到 vue3&#xff0c;且使用 vue3 的 选项式 API。构建工具要从 vue-cli&#xff08;webpack&#xff09;升级到 vite。路由需要升级到…...

利用函数模块化代码实操 ← Python

【知识点】 ● 模块化可以使代码易于维护和调试&#xff0c;并且提高代码的重用性。 ● 函数可以用来减少冗余的代码并提高代码的可重用性。函数也可以用来模块化代码并提高程序的质量。 ● 在 Python 中&#xff0c;可以将函数的定义放在一个被称为模块的文件中,这种文件的后缀…...

Java高效编程(12):重写toString方法

解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 尽管 Object 类提供了 toString 方法的默认实现&#xff0c;但它返回的字符串通常不是类的使用者想要看到的。默认返回的字符串格式是类名加上“”符号和哈希码的十六进制表示&#xff0c;例如 PhoneNu…...

谷歌给到的185个使用生成式AI的案例

很多公司从利用AI回答问题&#xff0c;进而使用AI进行预测&#xff0c;向使用生成式AI Agent转变。AI Agent的独特之处在于它们可以采取行动以实现特定目标&#xff0c;比如引导购物者找到合适的鞋子&#xff0c;帮助员工寻找合适的健康福利&#xff0c;或在护理人员交接班期间…...

程序员如何通过专业与软技能提升核心竞争力

一、引言  随着AIGC的兴起&#xff0c;AI辅助编程工具如chatgpt、midjourney、claude等接二连三地涌现&#xff0c;编程领域的变革正逐步深化。面对这一变革&#xff0c;程序员们对于未来工作的前景有着种种不同的担忧和期待。他们担心AI可能取代部分编程工作&#xff0c;同时…...

基于YOLOv8的智能植物监测机器人

摘要:针对传统的植物病害检测方法依赖专家的经验,耗时耗力,并且准确性受限于个人的水平等问题。文中提出无线通信模块采用HTTP协议来传输数据图片,采用SoC核心处理器实现了便携化,采用对射式红外避障传感器实现自动避障功能。以YOLOv8算法为控制核心,并添加注意力机制以提…...

2024年OpenAI DevDay发布实时 API、提示缓存等新功能

就在几天前&#xff0c;一些重要人物如前 CTO Mira Murati 离开了 OpenAI。因此&#xff0c;看到 Sam Altman 在 DevDay 上登台&#xff0c;讨论开发者的新产品&#xff0c;感觉有点奇怪。 随着公司内部的这些变化&#xff0c;你不禁会想&#xff1a;我们还应该信任他吗&#…...

Raspberry Pi3B+之安装bookworm+Rpanion系统

Raspberry Pi3B之安装bookwormRpanion系统 1. 源由2. 系统安装3. 系统安装3.1 烧录系统3.2 设备接线3.3 配置无线3.4 更新系统3.5 安装git3.6 克隆Rpanion3.7 安装Rpanion 4. 系统管理5. 附录问题1&#xff1a;error: externally-managed-environment问题2&#xff1a;bookworm…...

无人机专业除理论外,飞手执照、组装、调试实操技术详解

无人机专业的学习除了丰富的理论知识外&#xff0c;飞手执照的获取、无人机的组装与调试等实操技术也是至关重要的。以下是对这些方面的详细解析&#xff1a; 一、无人机飞手执照 1. 必要性 法规要求&#xff1a;根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关法规…...

【网路通信基础与实践番外二】TCP协议的流量控制和拥塞控制以及二者区别和例题

TCP协议是端对端的协议&#xff0c;因此在数据进行传输的过程受发送方&#xff0c;数据通道&#xff0c;接收方三方状态的影响。我们用水龙头来比喻数据发送方&#xff0c;水管来比喻数据通道&#xff0c;水桶来表示数据接收方。 图(a)表示水桶太小&#xff0c;来不及接受注入…...

SpringBoot3+Vue3开发后台管理系统脚手架

后台管理系统脚手架 介绍 在快速迭代的软件开发世界里&#xff0c;时间就是生产力&#xff0c;效率决定成败。对于构建复杂而庞大的后台系统而言&#xff0c;一个高效、可定制的后台脚手架&#xff08;Backend Scaffold&#xff09;无疑是开发者的得力助手。 脚手架 后台脚…...

OpenFeign微服务部署

一.开启nacos 和redis 1.查看nacos和redis是否启动 docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用SpringSession共享例子 这里的两个例子在我的一个博客有创建过程&#xff0c…...

【C语言】数组(下)

【C语言】数组&#xff08;下&#xff09; 6、二维数组的创建6.1二维数组的概念6.2二维数组的创建 7、二维数组的初始化7.1不完全初始化7.2完全初始化7.3按照行初始化7.4初始化时可以省略行&#xff0c;但是不能省略列 8、二维数组的使用8.1 二维数组的下标8.2二维数组的输入和…...

cGANs with Projection Discriminator

基于映射鉴别器的CGAN 模型中&#xff0c;判别器&#xff08;Discriminator&#xff09;不是通过将条件信息简单地与特征向量拼接&#xff08;concatenate&#xff09;来使用条件信息&#xff0c;而是采用一种基于投影的方式&#xff0c;这种方式更加尊重条件信息在底层概率模…...

mysql学习教程,从入门到精通,SQL HAVING 子句(32)

1、SQL HAVING 子句 当然&#xff01;HAVING 子句在 SQL 中用于对分组后的结果进行过滤。它通常与 GROUP BY 子句一起使用&#xff0c;以便对聚合函数&#xff08;如 SUM(), COUNT(), AVG(), MAX(), MIN() 等&#xff09;的结果进行条件筛选。 以下是一个示例&#xff0c;假设…...

JavaScript while循环语句

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断循环执行代码块。 while(条件){语句;} var i0;while(i<100){console.log(i);i1;} 注意&#xff1a;所有的for循环都可以改写为while循环...

49天精通Java(Day 2):Java的基本语法

上期内容回顾 在上一期的内容中&#xff0c;我们介绍了Java的基本概念、历史背景&#xff0c;并完成了JDK 1.8的安装与环境配置。你还编写并运行了第一个简单的Java程序“Hello, World!”。今天&#xff0c;我们将深入探讨Java的基本语法&#xff0c;包括变量、数据类型、运算…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

GB/T 43887-2024 核级柔性石墨板材检测

核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标&#xff1a; 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...