bitset 相关题目
#515. 「LibreOJ β Round #2」贪心只能过样例
题意: 给出 n 个数 \(x_i\), 每个数的取值范围为 \([a_i, b_i]\), 求 \(\sum{x_i^2}\) 的种类数. \(1 ≤ n ≤ 100, 1 ≤ a_i, b_i ≤ 100\).
思路: 直接状压的话需要枚举每个状态, 有了 bitset 之后就可以整体右移来转移了.
view code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)
const int maxn = 105;
int n, a[maxn], b[maxn];
bitset<1000001> dp[maxn];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n;
    inc(i, 1, n) cin >> a[i] >> b[i];
    dp[0][0] = 1;
    inc(i, 1, n) inc(j, a[i], b[i]) dp[i] |= dp[i - 1] << (j * j);
    cout << dp[n].count() << "\n";
}
题意: 五维偏序.
思路: 用 bitset 维护每个维度排序后的标号前缀. 这个写法本质就是对暴力的优化. 复杂度 \(O(\frac{n^2}{w})\). 本题目 N 为3e4, 所以时间空间可以接受.
view code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
const int maxn = 3e4 + 5;
int n;
pii p[6][maxn];
bitset<maxn> stu[6][maxn], ans;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n;
    inc(i, 1, n) {
        inc(j, 1, 5) {
            cin >> p[j][i].fi;
            p[j][i].se = i;
        }
    }
    inc(i, 1, 5) sort(p[i] + 1, p[i] + n + 1);
    inc(i, 1, 5) {
        inc(j, 2, n) {
            stu[i][p[i][j].se] = stu[i][p[i][j - 1].se];
            stu[i][p[i][j].se].set(p[i][j - 1].se);
        }
    }
    inc(i, 1, n) {
        ans.set();
        inc(j, 1, 5) ans &= stu[j][i];
        cout << ans.count() << "\n";
    }
}
分块的写法(只是试过 hiho 的数据, 5e4 的 Cogs 现在访问不了了, 不知道会不会T):
view code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
const int maxn = 3e4 + 5;
const int block = 240;
int n;
int a[6][maxn];
pii p[6][maxn];
bitset<maxn> ans, tmp;
bitset<maxn> bit[6][240];
vector<int> cit[6][240];
int bel[maxn];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    //freopen("try.in", "r", stdin);
    //freopen("try2.out", "w", stdout);
    cin >> n;
    inc(i, 0, n - 1) {
        inc(j, 0, 4) {
            cin >> p[j][i].fi;
            p[j][i].se = i;
        	a[j][i] = p[j][i].fi;
		}
    }
    inc(i, 0, n - 1) bel[i] = i / block;
    inc(i, 0, 4) sort(p[i], p[i] + n);
    inc(i, 0, 4) {
        bitset<maxn> w;
        vector<int> v;
        w.reset();
        inc(j, 0, n - 1) {
            w.set(p[i][j].se);
            v.push_back(p[i][j].se);
            if (j == n - 1 || bel[j] != bel[j + 1]) {
                bit[i][bel[j]] = w;
                cit[i][bel[j]] = v;
                vector<int>().swap(v);
            }
        }
    }
    inc(i, 0, n - 1) {
        ans.set();
        inc(j, 0, 4) {
            tmp.reset();
            int f = (a[j][i] - 1) / block;
            if (f) tmp |= bit[j][f - 1];
            for (int k = 0; k < (int)cit[j][f].size(); k++) {
                int id = cit[j][f][k];
                if (id == i) break;
                tmp.set(id);
            }
            ans &= tmp;
        }
        cout << ans.count() << "\n";
    }
}
Codeforces - 1097F Alex and a TV Show
题意: 给出 n 个可重集, 有四种操作: 1.把一个集合设为一个数; 2.把一个集合变成另外两个集合的并; 3.把一个集合变为从另外两个集合中各取一个数的 gcd; 4.询问集合中某一个数的个数模2. n ≤ 1e5, 操作 q ≤ 1e6, 值域 7000.
思路: 做法是搬运的, 我并不会做. 如果用 bitset 维护每个集合, 此时不好处理操作3. 改变思路, 既然和 gcd 有关就令 bitset 维护每个集合的约数(此时仍是可重集, 并且已模2, 不然咋存), 考虑每个数出现的奇偶, 就会发现操作 2, 3 分别对应异或, 按位与. 而操作 4 要用莫比乌斯函数推导一下:
\]
在模 2 意义下 +1 和 -1 都是 1, 只要考虑那些莫比乌斯函数不为 0 的情况, 预处理出每一个数的含平方因子的倍数情况.
view code
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inc(i, l, r) for (int i = l; i <= r; i++)
const int maxn = 1e5 + 5;
const int maxm = 7005;
int n, q, op, x, y, z;
bitset<7005> fac[maxm], mul[maxm], mu, a[maxn];
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    mu.set();
    inc(i, 1, 7000) {
        for (int j = 2; i * j * j <= 7000; j++) {
            mu[i * j * j] = 0;
        }
    }
    inc(i, 1, 7000) {
        for (int j = 1; i * j <= 7000; j++) {
            fac[i * j][i] = 1;
            mul[i][i * j] = mu[j];
        }
    }
    cin >> n >> q;
    while (q--) {
        cin >> op;
        if (op == 1) {
            cin >> x >> y;
            a[x] = fac[y];
        } else if (op == 2) {
            cin >> x >> y >> z;
            a[x] = a[y] ^ a[z];
        } else if (op == 3) {
            cin >> x >> y >> z;
            a[x] = a[y] & a[z];
        } else {
            cin >> x >> y;
            cout << (a[x] & mul[y]).count() % 2;
        }
    }
}
bitset 相关题目的更多相关文章
- LeetCode: Palindrome 回文相关题目
		LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ... 
- leetcode tree相关题目总结
		leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ... 
- [LeetCode] 链表反转相关题目
		暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ... 
- [LeetCode] [链表] 相关题目总结
		刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ... 
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
		前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ... 
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
		1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ... 
- [LeetCode] 二叉树相关题目(不完全)
		最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ... 
- LeetCode - 排列相关题目
		1.获取全排列 https://leetcode.com/problems/permutations/submissions/ 按字典序输出: 这里用的是vector<int>,不是引用. ... 
- 剑指offer编程题Java实现——面试题4后的相关题目
		题目描述: 有两个排序的数字A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的. 还是利用从后向前比较两个数组中的数字的方式来 ... 
随机推荐
- py函数式编程
			函数式编程把计算视为函数而非指令,纯函数式编程不需要变量,没有副作用,测试简单,python支持的函数式编程不是纯函数式编程,允许有变量存在,支持高阶函数,支持闭包,有限度的支持匿名函数 变量可以指向 ... 
- OpenFlow(OVS)下的“路由技术”
			前言 熟悉这款设备的同学,应该也快到不惑之年了吧!这应该是Cisco最古老的路由器了.上个世纪80年代至今,路由交换技术不断发展,但是在这波澜壮阔的变化之中,总有一些东西在嘈杂的机房内闪闪发光,像极了 ... 
- Python3基础语法和数据类型
			Python3基础语法 编码 默认情况下,Python3源文件以UTF-8编码,所有字符串都是unicode字符串.当然你也可以为原码文件制定不同的编码: # -*- coding: 编码 -*- 标 ... 
- Java easyui 下拉框默认选中第一个
			html代码: <tr> <td> <div style="margin-bottom:5px">计价方式: <%--下拉框默认选中第 ... 
- cocos2d-x android 入门
			前一段时间使用传统方式做了一个CS软件,发现 UI 显示的比较慢,突发奇起,开始研究起来 GPU 加速,最后开始学习 cocos2dx. 开发环境以最新的 Cocos2d-x 3.17.1 Andro ... 
- 为企业提供存储功能的Red Hat Stratis 2.0.1发布了
			导读 Red Hat的Stratis存储项目用于在Linux上提供企业存储功能,以与ZFS和Btrfs之类的产品竞争,同时在LVM和XFS之上构建,这是其2020年守护进程的首次更新. 通过Strat ... 
- HashMap底层源码剖析
			HashMap底层源码剖析 一.HashMap底层用到的数据结构 数组+单向链表+红黑树 数组:数组每一项都是一个链表,其实就是数组和链表的结合体 单向链表:当法神hash碰撞时,首先会找到数组对应位 ... 
- 建议20:建议通过Function扩展类型
			JavaScript允许为语言的基本数据类型定义方法.通过Object.prototype添加原型方法,该方法可被所有的对象,.这样的方法对函数,数组,字符串,数字,正则表达式和布尔值都适用.例如,通 ... 
- 【学习参考】Animate.css动画演示
			学习参考地址: http://www.dowebok.com/demo/2014/98/ 
- Vulnhub靶场DC-1 WP
			前言 之前提到过最近在做vlunhub的靶场复现工作,今天开始更新writeup吧.(对着walkthrough一顿乱抄嘻嘻嘻) 关于DC-1(官网翻译来的) 描述 DC-1是一个专门构建的易受攻击的 ... 
