HihoCoder#1513 : 小Hi的烦恼(五维数点 bitset 分块)
2024-08-28 07:25:47
题意
Sol
五位数点问题,写个cdq分治套cdq分治套cdq分治套cdq分析就完了 可以用bitset搞
对于每一科开\(n\)个bitset,其中\(b[i]\)表示的排名为\(1 - i\)的人是哪些
查询的时候把每科的bitset &起来就行了
复杂度\(k\frac{n^2}{32}\)
然后可以分块加速一下
注意这里在预处理有个关于势能分析的操作:如果块内元素较少的话,可以每次跑根号个,然后和前面的|起来,如果元素较多的话直接从1开始跑
复杂度:\(k\frac{n\sqrt(n)}{32}\)
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 30001;
inline int read() {
int x = 0, f = 1; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, a[5][MAXN], rak[5][MAXN], base = 1;
bitset<MAXN> B[5][175];
main() {
N = read(); base = sqrt(N);
for (int i = 1; i <= N; i++) for (int j = 0; j < 5; j++) a[j][i] = read(), rak[j][a[j][i]] = i;
for (int j = 0; j < 5; j++)
for (int i = 1; i * base <= N; i++)
for(int k = 1; k <= i * base; k++) B[j][i].set(rak[j][k]);
for (int i = 1; i <= N; i++) {
bitset<MAXN> tmp, cal; tmp.set();
for(int j = 0; j < 5; j++) {
cal.reset();
int now = a[j][i] / base;
cal |= B[j][now];
for(int k = now * base + 1; k <= a[j][i]; k++) cal.set(rak[j][k]);
tmp &= cal;
}
printf("%d\n", tmp.count() - 1);
}
}
最新文章
- 有问题得就分享(此实现不是 Windows 平台 FIPS 验证的加密算法的一部分)
- 滚动轮播效果,.net 没得混看来只能去写js 了
- NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)
- 【poj3468】 A Simple Problem with Integers
- HDU 5783 Divide the Sequence(数列划分)
- PHP 定时任务|Cron
- java.util.Hashtable源码分析
- Win10 的虛擬桌面
- Spring事务管理的实现方式之编程式事务与声明式事务详解
- Js 作用域与作用域链与执行上下文不得不说的故事 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
- springcloud
- ionic3/4 使用NavController 返回两层的方式
- 记一次bond引起的网络故障
- HDU 1045 Fire Net 【二分图匹配】
- day 54 jQuery 的初步基础
- js修改table中Td的值(定义td的单击事件)
- 【优质】React的学习资源
- iOS UI-微博案例(通过代码自定义Cell)
- Openstack入门篇(十五)之如何创建生产使用的openstack镜像
- [C#]ref,out关键字的作用