题意

题目链接

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);
}
}

最新文章

  1. 有问题得就分享(此实现不是 Windows 平台 FIPS 验证的加密算法的一部分)
  2. 滚动轮播效果,.net 没得混看来只能去写js 了
  3. NGUI 屏幕自适应大屏与小屏(初始设定宽高为1280x720,能适应比其小或者更大的屏)
  4. 【poj3468】 A Simple Problem with Integers
  5. HDU 5783 Divide the Sequence(数列划分)
  6. PHP 定时任务|Cron
  7. java.util.Hashtable源码分析
  8. Win10 的虛擬桌面
  9. Spring事务管理的实现方式之编程式事务与声明式事务详解
  10. Js 作用域与作用域链与执行上下文不得不说的故事 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
  11. springcloud
  12. ionic3/4 使用NavController 返回两层的方式
  13. 记一次bond引起的网络故障
  14. HDU 1045 Fire Net 【二分图匹配】
  15. day 54 jQuery 的初步基础
  16. js修改table中Td的值(定义td的单击事件)
  17. 【优质】React的学习资源
  18. iOS UI-微博案例(通过代码自定义Cell)
  19. Openstack入门篇(十五)之如何创建生产使用的openstack镜像
  20. [C#]ref,out关键字的作用

热门文章

  1. bzoj 1013: [JSOI2008]球形空间产生器sphere【高斯消元】
  2. Python项目完成
  3. CF581B Luxurious Houses 模拟
  4. ssh证书生成与配置
  5. 使用cookie实现自动登录
  6. Xcode上传appstore 出现 Found an unexpected Mach-O header code: 0x72613c21 错误
  7. H - 逆序数(树状数组)
  8. Java换行符
  9. 1 Groovy
  10. sscanf()分割字符数组