Bitset([HZOI 2015]偏序++)
Bitset简介
下面介绍C++ STL 中一个非常有用的东西:
Bitset
类似于二进制状压,它可以把信息转化成一个01串存储起来
定义方法:
首先要#include<bitset>或#include<bits/stdc++.h>
然后定义一个长度为len的bitset S
bitset<len>S;
一些操作
bitset还支持&,^,|三个运算
b._Find_first() 找到第一个1的位置
b._Find_next(x)找到x后面为1的第一个位置
复杂度
时间:我感觉很慢,但学长说是O(玄学),而且开了氧气优化后跑的飞快
空间:自己测一下就好
[HZOI 2015]偏序++
题面戳我
这是一道有趣的k+1维偏序,加上下标最多有7维
树套树套树套......套树?显然写不出
几层CDQ套在一起?O(n log^k n),TLE飞了
kd-tree可以卡过
这道题可以考虑用bitset做
对于每一个k+1维的组合,如果求出每一维小于它的集合,答案就是每一维的交集,就是二进制按位与
用bitset可以做到
可以这样bitset <40000> S[8][40000]
然后就AC了
???等等,你当bitset不要空间的吗?显然不行
所以我们考虑分块,只记录下每块块顶的,快内的暴力算,时间O(\(n\sqrt n\))
可以吊打kd-tree
代码
# include <bits/stdc++.h>
# define IL inline
# define RG register
# define Fill(a, b) memset(a, b, sizeof(a))
# define Copy(a, b) memcpy(a, b, sizeof(a))
# define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
using namespace std;
typedef long long ll;
const int _(5e4 + 10);
IL ll Read(){
RG char c = getchar(); RG ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, bl[_], pre[_], suf[_], blo, k, b[8][_], bblo;
pair <int, int> a[8][_];
bitset <_> S[8][250];
IL int Find(RG int v, RG int x){
RG int l = 1, r = n, ans = 0;
while(l <= r){
RG int mid = (l + r) >> 1;
if(a[x][mid].first <= v) l = mid + 1, ans = mid;
else r = mid - 1;
}
return ans;
}
IL bitset <_> Getbst(RG int x, RG int y){
bitset <_> ans; ans.reset();
RG int pos = Find(y, x);
if(!pos) return ans;
ans = S[x][bl[pos] - 1];
for(RG int i = pre[pos]; i <= pos; ++i) ans.set(a[x][i].second);
return ans;
}
IL ll Calc(){
bitset <_> ans; RG ll ret = 0;
for(RG int i = 1; i <= n; ++i){
ans.set();
for(RG int j = 1; j <= k; ++j) ans &= Getbst(j, b[j][i]);
ret += ans.count() - 1;
}
return ret;
}
int main(RG int argc, RG char* argv[]){
File("partial_order_plus");
n = Read(); k = Read() + 1; bblo = sqrt(n);
for(RG int i = 1; i <= n; ++i) a[1][i] = make_pair(b[1][i] = i, i);
for(RG int j = 2; j <= k; ++j)
for(RG int i = 1; i <= n; ++i)
a[j][i] = make_pair(b[j][i] = Read(), i);
for(RG int i = 1; i <= n; ++i){
bl[i] = (i - 1) / bblo + 1;
pre[i] = (bl[i] - 1) * bblo + 1;
suf[i] = min(n, bl[i] * bblo);
}
blo = bl[n];
for(RG int i = 2; i <= k; ++i) sort(a[i] + 1, a[i] + n + 1);
for(RG int j = 1; j <= k; ++j)
for(RG int i = 1; i <= blo; ++i){
S[j][i] = S[j][i - 1]; RG int d = (i - 1) * bblo + 1;
for(RG int l = pre[d]; l <= suf[d]; ++l) S[j][i].set(a[j][l].second);
}
printf("%lld\n", Calc());
return 0;
}
Bitset([HZOI 2015]偏序++)的更多相关文章
- COGS 2580. [HZOI 2015]偏序 II
COGS 2580. [HZOI 2015]偏序 II 题目传送门 题目大意:给n个元素,每个元素有具有4个属性a,b,c,d,求i<j并且ai<aj,bi<bj,ci<cj, ...
- BZOJ 2287. [HZOI 2015]疯狂的机器人 [FFT 组合计数]
2287. [HZOI 2015]疯狂的机器人 题意:从原点出发,走n次,每次上下左右不动,只能在第一象限,最后回到原点方案数 这不煞笔提,组合数写出来发现卷积NTT,然后没考虑第一象限gg 其实就是 ...
- 【COGS】2287:[HZOI 2015]疯狂的机器人 FFT+卡特兰数+排列组合
[题意][COGS 2287][HZOI 2015]疯狂的机器人 [算法]FFT+卡特兰数+排列组合 [题解]先考虑一维的情况,支持+1和-1,前缀和不能为负数,就是卡特兰数的形式. 设C(n)表示第 ...
- [cogs2314][HZOI 2015] Persistable Editor - 可持久化平衡树
[cogs2314][HZOI 2015]Persistable Editor - 可持久化平衡树 题目链接 首先吐槽扯淡几句 [题目描述] 维护一种可持久化的文本编辑器,支持下列操作: 1 p st ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
- cogs 2320. [HZOI 2015]聪聪的世界题解
2320. [HZOI 2015]聪聪的世界 时间限制:6 s 内存限制:512 MB [题目描述] 背景: 聪聪的性取向有问题. 题目描述: 聪聪遇到了一个难题: 给出一个序列a1…an,完成以 ...
- 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)
传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...
- hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...
- 数据结构(分块):[HZOI 2015]easy seq
[题目描述] 给定一个序列,下标从0开始,分别为a0,a1,a2...an−1,有m个询问,每次给出l和r,求满足ai=aj且l<=i<=j<=r时j−i的最大值 本题强制在线,l和 ...
随机推荐
- xBIM WeXplorer xViewer 浏览器检查
目录 基础 xBIM WeXplorer 简要介绍 xBIM WeXplorer xViewer 基本应用 xBIM WeXplorer xViewer 浏览器检查 xBIM WeXplorer xV ...
- 【收藏】8段JQuery处理表单的代码片段,很实用
1 只接受数字输入 $("#uAge").keydown(function(event) { // 允许退格和删除键 if ( event.keyCode == 46 || eve ...
- 基于jq的表单填充
//表单填充 formDataLoad: function (domId, obj) { for (var property in obj) { if (obj.hasOwnProperty(prop ...
- CSS布局(二) 盒子模型属性
盒子模型的属性 宽高width/height 在CSS中,可以对任何块级元素设置显式高度. 如果指定高度大于显示内容所需高度,多余的高度会产生一个视觉效果,就好像有额外的内边距一样: 如果指定高度小于 ...
- Asp.Net Core Identity+EFCore + Mysql踩坑记录
搭建基础框架准备试试传说中的Identity,本以为很顺利,结果一路踩了N多坑 遂就把过程记录下来.方便自己以后查看,也希望能帮到遇到同样问题的朋友. 1.首先,引入Identity需要的类库,还有M ...
- python爬虫提取冰与火之歌五季的种子
# -*- encoding:utf-8 -*- import requests import re import sys reload(sys) sys.setdefaultencoding(&qu ...
- 集成 solr6.5.1到 tomcat7(8) 中 (解决java.lang.NoSuchMethodError问题)
♣下载solr安装包 ♣安装solr ♣solr应用部署到tomcat下 ♣配置web.xml ♣在tomcat7启动 ♣改为在tomcat8启动 ♣在自带的Jetty里启动 ♣建立第一个Core 安 ...
- 如何使用 OpenCV 打开摄像头获取图像数据?
OpenCV 如何打开摄像头获取图像数据? 代码运行环境:Qt 5.9.1 msvc2015 32bit OpenCV 3.3.0 #include "include/opencv2/ope ...
- Android安全机制
1)Android是基于Linux内核的,因此Linux对文件权限的控制同样适用于Android.在Android中每个应用都有自己的/data/data/包名文件夹,该文件夹只能该应用访问,而其他应 ...
- UVA1602
实现的细节很多,学到了如何翻转.旋转.平移,get很多技巧,值得一做. AC代码: #include<cstdio> #include<cstring> #include< ...