论如何优雅的用bitset来求四维偏序
四维偏序。。
就是给你一个四维集合。再给你一些询问,请你求出a[i].x1<=ask.x1&&a[i].x2<=ask.x2&&a[i].x3<=ask.x3&&a[i].x4<=ask.x4的个数。。
集合大小<=30000
询问个数<=30000
然后怎么做呢??
其实很简单只要排序+cdq+树状数组套平衡树什么的就行了
qnmd老子不会。。
这时!
神器来了!
那就是bitset!
众所周知,bitset能存一堆二进制位每一位的状态,而且,bitset和bitset之间是可以进行&操作的
也就是说,我们每次可以对第i位排个序,在判断第i个集合是否满足询问条件,bitset&一下就好了!
放上代码
#include<cmath>
#include<cstdio>
#include<bitset>
#include<algorithm>
#define N 40000
#define eps 1e-8
using namespace std;
int i,j,k,n,m,x,y,t;
struct data{double x1,x2,x3,x4;int id,p;}p[N],q[N],pq[N+N];
bitset<N> ans[N],w;
bool same(double a,double b){return fabs(a-b)<eps;}
bool cmp1(const data&a,const data&b){return same(a.x1,b.x1)?a.p>b.p:a.x1<b.x1-eps;}
bool cmp2(const data&a,const data&b){return same(a.x2,b.x2)?a.p>b.p:a.x2<b.x2-eps;}
bool cmp3(const data&a,const data&b){return same(a.x3,b.x3)?a.p>b.p:a.x3<b.x3-eps;}
bool cmp4(const data&a,const data&b){return same(a.x4,b.x4)?a.p>b.p:a.x4<b.x4-eps;}
int main(){
scanf("%d",&n);
for (i=;i<=n;i++){scanf("%lf%lf%lf%lf",&p[i].x1,&p[i].x2,&p[i].x3,&p[i].x4);p[i].id=i;p[i].p=;}
scanf("%d",&m);
for (i=;i<=m;i++){scanf("%lf%lf%lf%lf",&q[i].x1,&q[i].x2,&q[i].x3,&q[i].x4);q[i].id=i;q[i].p=;}
for (i=;i<=m;i++)ans[i].set();
//-----------------------------------------------------------------
for (i=;i<=n;i++)pq[i]=p[i];
for (i=;i<=m;i++)pq[n+i]=q[i];
sort(pq+,pq++n+m,cmp1);
w.reset();
for (i=;i<=n+m;i++)if (pq[i].p)w[pq[i].id]=;else ans[pq[i].id]&=w;
//-----------------------------------------------------------------
for (i=;i<=n;i++)pq[i]=p[i];
for (i=;i<=m;i++)pq[n+i]=q[i];
sort(pq+,pq++n+m,cmp2);
w.reset();
for (i=;i<=n+m;i++)if (pq[i].p)w[pq[i].id]=;else ans[pq[i].id]&=w;
//-----------------------------------------------------------------
for (i=;i<=n;i++)pq[i]=p[i];
for (i=;i<=m;i++)pq[n+i]=q[i];
sort(pq+,pq++n+m,cmp3);
w.reset();
for (i=;i<=n+m;i++)if (pq[i].p)w[pq[i].id]=;else ans[pq[i].id]&=w;
//-----------------------------------------------------------------
for (i=;i<=n;i++)pq[i]=p[i];
for (i=;i<=m;i++)pq[n+i]=q[i];
sort(pq+,pq++n+m,cmp4);
w.reset();
for (i=;i<=n+m;i++)if (pq[i].p)w[pq[i].id]=;else ans[pq[i].id]&=w;
for (i=;i<=m;i++)printf("%d\n",ans[i].count());
return ;
}
分隔符是为了分开四次排序。。
复杂度是O(n*m/32)....
尽管看上去很慢但是。。
论如何优雅的用bitset来求四维偏序的更多相关文章
- 【学习笔记】使用 bitset 求解较高维偏序问题
求解五维偏序 给定 \(n(\le 3\times 10^4)\) 个五元组,对于每个五元组 \((a_i, b_i, c_i, d_i, e_i)\),求存在多少个 \(1\le j\le n\) ...
- Gym - 100342J:Triatrip(Bitset加速求三元环的数量)
题意:求有向图里面有多少个三元环. 思路:枚举起点A,遍历A可以到的B,然后求C的数量,C的数量位B可以到是地方X集合,和可以到A的地方Y集合的交集(X&Y). B点可以枚举,也可以遍历.(两 ...
- Bitset([HZOI 2015]偏序++)
Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...
- HihoCoder - 1513 bitset处理五维偏序
题意:给出\(n<3e4\)个有序组\((a,b,c,d,e)\),求对第\(i\)个有序组有多少个\(j\)满足\((a_j<a_i,b_j<b_i,c_j<c_i,d_j& ...
- SPOJ:Another Longest Increasing Subsequence Problem(CDQ分治求三维偏序)
Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it ...
- hdu5618(cdq分治求三维偏序)
题意:给n(n<=100000)个点,坐标为(xi,yi,zi)(1<=xi,yi,zi<=100000),定义一个点A比一个点B小,当且仅当xA<=xB,yA<=yB, ...
- [COGS2479]偏序
[COGS2479]偏序 题目大意: \(n(n\le50000)\)个四元组,求四维偏序. 思路: CDQ分治套CDQ分治套树状数组. 细节: 第二层CDQ之前要备份数组\(a\),否则第二层CDQ ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...
- 【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal
有两辆车,容量都为K,有n(10w)个人被划分成m(2k)组,依次上车,每个人上车花一秒.每一组的人都要上同一辆车,一辆车的等待时间是其停留时间*其载的人数,问最小的两辆车的总等待时间. 是f(i,j ...
随机推荐
- 一个IOS自动化打包的脚本
网上找了一个脚本,在其中进行了修改,只需要一条命令就可以了 支持自动导入配置文件 支持自动安装p12证书 支持自动修改版本号和build版本号 支持自动修改app显示名称 支持自动修改bundle i ...
- excel的宏与VBA入门(一)——基础概念
一.概述 "记录宏"其实就是将工作的一系列操作结果录制下来,并命名存储(相当于VB中一个子程序). 宏其实就是VBA写的,但是可以通过录制的方法制作宏,做好的宏你可以查看相应的VB ...
- 课程设计个人报告——基于ARM实验箱的Android交友软件的设计与实现
个人贡献 熟悉试验箱各元件功能以及连接组装试验箱 一.实验内容 研究实验箱串口.USB线的调通连接 二.实践步骤 1.打开实验箱,首先了解各元件功能 这个是LTE模块,也叫4G模块,具体的作用是硬件将 ...
- 20155323刘威良 网络对抗 Exp2 后门原理与实践
20155323 刘威良<网络攻防>Exp2后门原理与实践 实验内容 (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用socat获取主机操作Shell, ...
- 20155338《网络对抗》Exp3 免杀原理与实践
20155338<网络对抗>Exp3 免杀原理与实践 实验过程 一.免杀效果参考基准 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.v ...
- jq 在字符串中,去掉指定的元素
例: var arr= ["4.5岁", "3.5岁", "5.5岁", "5岁", "4岁"] v ...
- sql优化详细介绍学习笔记
因为最近在面试,发现sql优化这个方面问的特别特别的多.之前都是零零星星,不够全面的了解一点,刚刚在网上查了一下,从 http://blog.csdn.net/zhushuai1221/article ...
- 设计模式 笔记 原型模式 prototype
//---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...
- Unity插件-NGUI学习笔记
Anchors 的作用 类似Android里面的.9格式图片的功能, 边框可以随着文字变大而变大. 实现方法: 用NGUI 创建一个Sprite, 命名为TextBg, 一个Label, Label的 ...
- 1080. Graduate Admission (30)-排序
先对学生们进行排序,并且求出对应排名. 对于每一个学生,按照志愿的顺序: 1.如果学校名额没满,那么便被该学校录取,并且另vis[s][app[i].ranks]=1,表示学校s录取了该排名位置的学生 ...