#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
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inc(i, l, r) for (int i = l; i <= r; i++)
  5. const int maxn = 105;
  6. int n, a[maxn], b[maxn];
  7. bitset<1000001> dp[maxn];
  8. int main() {
  9. ios::sync_with_stdio(false);
  10. cin.tie(nullptr);
  11. cin >> n;
  12. inc(i, 1, n) cin >> a[i] >> b[i];
  13. dp[0][0] = 1;
  14. inc(i, 1, n) inc(j, a[i], b[i]) dp[i] |= dp[i - 1] << (j * j);
  15. cout << dp[n].count() << "\n";
  16. }

 

hihocoder#1513 : 小Hi的烦恼

题意: 五维偏序.

思路: 用 bitset 维护每个维度排序后的标号前缀. 这个写法本质就是对暴力的优化. 复杂度 \(O(\frac{n^2}{w})\). 本题目 N 为3e4, 所以时间空间可以接受.

view code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inc(i, l, r) for (int i = l; i <= r; i++)
  5. #define pii pair<int, int>
  6. #define fi first
  7. #define se second
  8. #define pb push_back
  9. const int maxn = 3e4 + 5;
  10. int n;
  11. pii p[6][maxn];
  12. bitset<maxn> stu[6][maxn], ans;
  13. int main() {
  14. ios::sync_with_stdio(false);
  15. cin.tie(nullptr);
  16. cin >> n;
  17. inc(i, 1, n) {
  18. inc(j, 1, 5) {
  19. cin >> p[j][i].fi;
  20. p[j][i].se = i;
  21. }
  22. }
  23. inc(i, 1, 5) sort(p[i] + 1, p[i] + n + 1);
  24. inc(i, 1, 5) {
  25. inc(j, 2, n) {
  26. stu[i][p[i][j].se] = stu[i][p[i][j - 1].se];
  27. stu[i][p[i][j].se].set(p[i][j - 1].se);
  28. }
  29. }
  30. inc(i, 1, n) {
  31. ans.set();
  32. inc(j, 1, 5) ans &= stu[j][i];
  33. cout << ans.count() << "\n";
  34. }
  35. }

分块的写法(只是试过 hiho 的数据, 5e4 的 Cogs 现在访问不了了, 不知道会不会T):

view code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inc(i, l, r) for (int i = l; i <= r; i++)
  5. #define pii pair<int, int>
  6. #define fi first
  7. #define se second
  8. #define pb push_back
  9. const int maxn = 3e4 + 5;
  10. const int block = 240;
  11. int n;
  12. int a[6][maxn];
  13. pii p[6][maxn];
  14. bitset<maxn> ans, tmp;
  15. bitset<maxn> bit[6][240];
  16. vector<int> cit[6][240];
  17. int bel[maxn];
  18. int main() {
  19. ios::sync_with_stdio(false);
  20. cin.tie(nullptr);
  21. //freopen("try.in", "r", stdin);
  22. //freopen("try2.out", "w", stdout);
  23. cin >> n;
  24. inc(i, 0, n - 1) {
  25. inc(j, 0, 4) {
  26. cin >> p[j][i].fi;
  27. p[j][i].se = i;
  28. a[j][i] = p[j][i].fi;
  29. }
  30. }
  31. inc(i, 0, n - 1) bel[i] = i / block;
  32. inc(i, 0, 4) sort(p[i], p[i] + n);
  33. inc(i, 0, 4) {
  34. bitset<maxn> w;
  35. vector<int> v;
  36. w.reset();
  37. inc(j, 0, n - 1) {
  38. w.set(p[i][j].se);
  39. v.push_back(p[i][j].se);
  40. if (j == n - 1 || bel[j] != bel[j + 1]) {
  41. bit[i][bel[j]] = w;
  42. cit[i][bel[j]] = v;
  43. vector<int>().swap(v);
  44. }
  45. }
  46. }
  47. inc(i, 0, n - 1) {
  48. ans.set();
  49. inc(j, 0, 4) {
  50. tmp.reset();
  51. int f = (a[j][i] - 1) / block;
  52. if (f) tmp |= bit[j][f - 1];
  53. for (int k = 0; k < (int)cit[j][f].size(); k++) {
  54. int id = cit[j][f][k];
  55. if (id == i) break;
  56. tmp.set(id);
  57. }
  58. ans &= tmp;
  59. }
  60. cout << ans.count() << "\n";
  61. }
  62. }

 

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 要用莫比乌斯函数推导一下:

\[\begin{aligned}&\sum\limits_{i\in A}[\frac i x=1]\\=&\sum\limits_{i\in A}\sum\limits_{d|\frac i x}\mu(d)\\=&\sum\limits_{d\in A',x|d}\mu(\frac d x)\end{aligned}
\]

在模 2 意义下 +1 和 -1 都是 1, 只要考虑那些莫比乌斯函数不为 0 的情况, 预处理出每一个数的含平方因子的倍数情况.

view code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define inc(i, l, r) for (int i = l; i <= r; i++)
  5. const int maxn = 1e5 + 5;
  6. const int maxm = 7005;
  7. int n, q, op, x, y, z;
  8. bitset<7005> fac[maxm], mul[maxm], mu, a[maxn];
  9. int main() {
  10. ios::sync_with_stdio(false);
  11. cin.tie(nullptr);
  12. mu.set();
  13. inc(i, 1, 7000) {
  14. for (int j = 2; i * j * j <= 7000; j++) {
  15. mu[i * j * j] = 0;
  16. }
  17. }
  18. inc(i, 1, 7000) {
  19. for (int j = 1; i * j <= 7000; j++) {
  20. fac[i * j][i] = 1;
  21. mul[i][i * j] = mu[j];
  22. }
  23. }
  24. cin >> n >> q;
  25. while (q--) {
  26. cin >> op;
  27. if (op == 1) {
  28. cin >> x >> y;
  29. a[x] = fac[y];
  30. } else if (op == 2) {
  31. cin >> x >> y >> z;
  32. a[x] = a[y] ^ a[z];
  33. } else if (op == 3) {
  34. cin >> x >> y >> z;
  35. a[x] = a[y] & a[z];
  36. } else {
  37. cin >> x >> y;
  38. cout << (a[x] & mul[y]).count() % 2;
  39. }
  40. }
  41. }

 

bitset 相关题目的更多相关文章

  1. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

  2. leetcode tree相关题目总结

    leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...

  3. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  4. [LeetCode] [链表] 相关题目总结

    刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...

  5. 九度 Online Judge 之《剑指 Offer》一书相关题目解答

    前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...

  6. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  7. [LeetCode] 二叉树相关题目(不完全)

    最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...

  8. LeetCode - 排列相关题目

    1.获取全排列 https://leetcode.com/problems/permutations/submissions/ 按字典序输出: 这里用的是vector<int>,不是引用. ...

  9. 剑指offer编程题Java实现——面试题4后的相关题目

    题目描述: 有两个排序的数字A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的. 还是利用从后向前比较两个数组中的数字的方式来 ...

随机推荐

  1. python2.7.6安装easy_install (windows 64 环境)

    1.复制以下代码保存到easy_install.py文件中(文件名可随意命名)并将该文件放到python的安装路径中(如:D:\Python27) #!/usr/bin/env python &quo ...

  2. javascript中你可能遇到的隐式调用

    前言 不知道用隐式调用来形容是否确切,其行为总是隐藏在背后,时不时出来露脸一下,作用貌似不大,但是了解一下还是有用处的,保不准在你的使用下大有作为.所谓的隐式调用简单来说就是自动调用一些方法,而这些方 ...

  3. 读《Java并发编程的艺术》学习笔记(二)

    第2章  Java并发机制的底层实现原理 Java代码在编译后变成字节码,字节码被类加载器加载到JVM中,JVM执行字节码,最终转换为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实 ...

  4. 写react项目要注意的事项

    1,className一定是大写字母开头,例如:App-logo,App,App-header. 2,有关react元素的更新,唯一办法是创建新元素,然后重新将其传入ReactDOM.render() ...

  5. py2.7 批量转换文件为 utf8 编码

    source insight 不支持 utf8 ,但是在 linux 上查看的时候是 utf8 编码,就会显示不正常,所以写了个 python 小脚本,可以批量转换 py2.7 #coding:utf ...

  6. NoVNC安装部署

    noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...

  7. HTC推出了VIVE Comos 全新 VR(虚拟现实)系列产品

    据 The Verge 报道,近日,HTC 推出了 VIVE Comos 全新 VR(虚拟现实)系列产品.包括 Cosmos 精英套装.VIVE Cosmos XR 版.Cosmos Play 基础版 ...

  8. ReentrantLock源码探究

    ReentrantLock是一种可重入锁,可重入是说同一个线程可以多次获取同一个锁,内部会有相应的字段记录重入次数,它同时也是一把互斥锁,意味着同时只有一个线程能获取到可重入锁. 1.构造函数 pub ...

  9. ui自动化chrome文件上传操作

    web自动化,再chrome浏览器中文件上传操作

  10. can do / will do / should do 情态动词

    can do = be able to do will do = be going to do should do = ought to do 情态动词 都是表示建议 从这里发现 to do (不确定 ...