博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HihoCoder - 1236 Scores (五维偏序,分块+bitset)
阅读量:4678 次
发布时间:2019-06-09

本文共 1145 字,大约阅读时间需要 3 分钟。

题意:给定n个五维空间上的点,以及m组询问,每组询问给出一个点,求五个维度都不大于它的点有多少个,强制在线。

神仙题

单独考虑每个维度,把所有点按这个维度上的大小排序,然后分成T块,每块用一个bitset记录这个块以及之前的块中包含的点的集合的前缀和,并用mx[i][j]来记录第i维上大小为j的点所对应的最右边的块。对于每个询问的点,也是单独考虑每个维度,找到每个维度上对应的块,把这个块之前的块的前缀和加上,然后再暴力加上这个块中所有当前维度不超过它的点,五个维度取个交集就行了。

预处理复杂度$O(n+\frac{nT}{B})$,单次询问复杂度$O(\frac{n}{T}+\frac{n}{B})$,总复杂度$O(n+\frac{nT}{B}+\frac{qn}{T}+\frac{qn}{B})$,理论上T=B(约为64)时复杂度最低。

1 #include
2 using namespace std; 3 typedef long long ll; 4 const int N=5e4+100,M=64,inf=0x3f3f3f3f; 5 struct D { 6 int x,i; 7 bool operator<(const D& b)const {
return x
bs[5][N/M],ans,now;11 int solve(int* b) {12 ans.set();13 for(int i=0; i<5; ++i) {14 now.reset();15 int j=mx[i][b[i]];16 if(j>0)now|=bs[i][j-1];17 for(int k=L[j]; k
<=b[i]; ++k)now.set(a[i][k].i);18 ans&=now;19 }20 return ans.count();21 }22 int main() {23 int T;24 for(scanf("%d",&T); T--;) {25 scanf("%d%d",&n,&m);26 memset(L,-1,sizeof L);27 memset(mx,0,sizeof mx);28 for(int j=0; j

 

转载于:https://www.cnblogs.com/asdfsag/p/10672360.html

你可能感兴趣的文章
.net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
查看>>
SAMBA服务和FTP服务讲解
查看>>
BZOJ 2301: [HAOI2011]Problem b
查看>>
用postman模拟ajax发送json数据的笔记
查看>>
洛谷 [P1118] IOI1994 数字三角形
查看>>
Hadoop HDFS文件操作
查看>>
使用vmimeNET解析账单邮件
查看>>
关于敲代码
查看>>
Winform 常用技巧
查看>>
hdu1418 欧拉公式
查看>>
自定义排序函数
查看>>
react build和server start
查看>>
YUM安装调试以及命令具体解释
查看>>
iOS开发UI篇—CAlayer(自定义layer)
查看>>
数据结构与算法分析学习笔记(二)--AVL树的算法思路整理
查看>>
nodejs review-04
查看>>
30行代码实现JavaScript中的MVC
查看>>
openwrt下定义软件包的依赖关系类型
查看>>
html代码中显示系统时间
查看>>
linux学习心得之vim/Cvim篇
查看>>