题目描述

给定一个有\(n\)个元素的序列,元素编号为\([1,n]\),每个元素有\(k\)个属性\(p_1,p_2,p_3,...,p_k\) ,求序列中满足 \(i<j\)且 \(1 \leq t \leq k\),\(p_{t,i}<p_{t,j}\) 的数对\((i,j)\)的个数。

输入格式

第一行两个整数 \(n\),\(k\),表示序列长度和属性个数。

接下来\(k\) 行,每行 \(n\)个整数,第\(t\) 行第 \(i\)个数表示\(p_{t,i}\) 。

输出格式

共1行,表示满足要求的数对个数。

样例

样例输入

5 4
1 4 5 2 3
3 5 2 1 4
2 3 4 1 5
2 3 1 5 4

样例输出

2

数据范围与提示

对于\(30\%\)的数据\(n \leq 5000\),\(k \leq 6\)

对于\(100\%\)的数据\(1 \leq n \leq 40000\),\(k \leq 6\)。保证对于所有元素的\(p_t\)属性组成一个\(1 - n\)的排列。

分析

这道题算上坐标的话,维数达到了\(7\)维

如果用一些数据结构去维护的话,很可能会超时

其实我们用 \(bitset\) 就可以搞定这道题

对于每一维,我们用 \(bitset\) 去存储小于\(i\)的数所在的位置

最后对于每一个位置\(i\),我们将这几个维度作位与运算

最后统计下标小于\(i\)的位置中\(1\)的个数

这样去处理时间复杂度为\(O(n \times k)\),空间复杂度为\(O(n^2 \times k)\)

而\(40000 \times 40000 \times 6\) 的\(bitset\)我们显然是开不下的

因此我们考虑用时间换空间

我们可以用分块的思想将时间复杂度和空间复杂度都均衡至\(O(nlogn\times k)\)

代码

#include <cstdio>
#include <bitset>
#include <cmath>
#include <iostream>
const int maxn = 4e4 + 5;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
int n, m, a[8][maxn], rk[8][maxn], blo;
std::bitset<maxn> b[8][305], now, js, ws;
int main() {
n = read(), m = read();
blo = sqrt(n);
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
a[i][j] = read();
rk[i][a[i][j]] = j;
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j * blo <= n; j++) {
b[i][j] = b[i][j - 1];
for (int k = (j - 1) * blo + 1; k <= j * blo; k++) {
b[i][j].set(rk[i][k]);
}
}
}
int ans = 0;
ws.reset();
for (int i = 1; i <= n; i++) {
now.set();
ws.set(i);
now &= ws;
for (int j = 1; j <= m; j++) {
int shuyu = a[j][i] / blo;
js.reset();
js |= b[j][shuyu];
for (int k = shuyu * blo + 1; k <= a[j][i]; k++) {
js.set(rk[j][k]);
}
now &= js;
}
ans += now.count() - 1;
}
printf("%d\n", ans);
return 0;
}

偏序 分块+bitset的更多相关文章

  1. 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...

  2. hihocoder1236(北京网络赛J):scores 分块+bitset

    北京网络赛的题- -.当时没思路,听大神们说是分块+bitset,想了一下发现确实可做,就试了一下,T了好多次终于过了 题意: 初始有n个人,每个人有五种能力值,现在有q个查询,每次查询给五个数代表查 ...

  3. 种树 by yoyoball [树分块+bitset]

    题面 给定一棵树,有点权 每次询问给出一些点对,求这些点对之间的路径的并集上不同权值的个数,以及这些权值的$mex$ 思路 先考虑只有一对点对,只询问不同权值个数的问题:树上莫队模板题 然后加个$me ...

  4. HihoCoder - 1236 Scores (五维偏序,分块+bitset)

    题目链接 题意:给定n个五维空间上的点,以及m组询问,每组询问给出一个点,求五个维度都不大于它的点有多少个,强制在线. 神仙题 单独考虑每个维度,把所有点按这个维度上的大小排序,然后分成T块,每块用一 ...

  5. hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

    题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给 ...

  6. Codeforces 917F Substrings in a String - 后缀自动机 - 分块 - bitset - KMP

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字母串,要求支持以下操作: 修改一个位置的字母 查询一段区间中,字符串$s$作为子串出现的次数 Solution 1 Bitset 每 ...

  7. CF1093E Intersection of Permutations [分块 +bitset]

    大家好, 我非常喜欢暴力数据结构, 于是就用分块A了此题 分块题,考虑前缀和 \(b_i\) 表示 bitset 即 \(0\) ~ $i $ 出现过的数字,然后考虑直接暴力复制块然后前缀和,修改也很 ...

  8. Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 2645  Solved: 1039[Submit][Status][Discuss] ...

  9. Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 578  Solved: 247[Submit][Status][Discuss] ...

随机推荐

  1. jmeter调试元件Debug Sampler的使用

    @@@@@@@@@@@@@@@ 活在当下 今天记录一下jmeter调试工具Debug Sampler的心得,调试对于计算机从业人员来说是家常便饭,jmeter虽然代码不多,但是也需要调试,那么如何进行 ...

  2. leetcode 5473

    这个题真是当时想麻烦了,,,感谢LLdl 提供的题解 其实一个很重要的点就是,如果后面的玩意翻转了偶数次,那就跟没变一样.如果是奇数次就取反. 怪我天真,第一反应就去位运算去了,,,,哪有那么复杂诶 ...

  3. Django学习路33_url 地址及删除元素 delete() 和重定向 return redirect('路径')

      保存日期 def create(request): '''新增一本图书''' # 1.创建BookInfo对象 b = BookInfo() b.btitle = '流星蝴蝶剑' b.bpub_d ...

  4. Django学习路13_创建用户登录,判断数据库中账号名密码是否正确

    在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...

  5. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  6. Codeforces Round #654 (Div. 2) A~E 题解

    LINK:CF R 654 div2 前言:F题是一个线段树分类讨论的题目 比赛的时候没看 赛后感觉没什么意思 所以咕掉了. 记事:第一次笼统的写一场比赛的题目 可能是我这场比赛打的太差了 题目不难 ...

  7. LVS-DR实现mysql负载均衡集群

    lvs-dr实现mysql负载均衡集群 环境说明: 服务器的操作系统均为centos7,vip和rip在同一网段,使用lvs-dr模型来实现mysql集群服务 所有服务器均已配置好处VIP外的静态IP ...

  8. Spring Security和Swagger2集成报错

    出现问题的项目算是一个新项目,但基本的脚手架代码是从另一个项目里迁过来的,原项目并没有报错,只有新项目才报异常.看报错内容,判断发生冲突的主要是spring-boot-starter-security ...

  9. python3 openssl问题(贼有用)

    目录 一.问题描述 二.排查过程 三.总结 四.写在最后 一.问题描述 在python3 执行任何的request请求时,都会报以下的错误,纵观全网,以下基本尝试过了,对于我这个是无效的,后来不知道怎 ...

  10. github 错误

    Push failed: Unable to access 'https://github.com/infoo/Neo4j.git/': The requested URL returned erro ...