题目蓝链

Solution

首先,很显然这题是要用莫队来处理的。我们先把输入的数字另外排一下序,然后记录一下\(p_i\)表示每一个数字对应在排好序的数列里面是排第几个。询问的时候要把一个询问拆成\(3\)个询问,然后再并起来。然后在莫队的时候记录\(cnt_i\)表示当前数字\(i\)出现的次数,再开一个\(bitset\),假设当前需要加入\(bitset\)的数字是\(x\),我们就令\(bitset\)中的第\(p_x + cnt_x\)位为\(1\),然后\(++cnt_x\)。这样就会使得把三个\(bitset\)并起来之后,恰好剩下的就是在三个区间都出现了的数字,也就是需要删除的数字,我们就只需要看并起来之后还剩多少个\(1\)就行了

还有一个问题,就是我们必须要对每一个询问(拆之前)都要开一个\(bitset\)来存答案,但这会开不下。所以我们就要平衡一下空间复杂度和时间复杂度,把询问分为几块来处理

所以其实我的程序还可以更快一些,那就是在给所有的块排好序之后再分块。但这样写起来有点麻烦,所以我就懒得卡了

Code

#include <bits/stdc++.h>using namespace std;#define squ(x) ((LL)(x) * (x))
#define debug(...) fprintf(stderr, __VA_ARGS__)typedef long long LL;
typedef pair<int, int> pii;inline int read() {int sum = 0, fg = 1; char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') fg = -1;for (; isdigit(c); c = getchar()) sum = (sum << 3) + (sum << 1) + (c ^ 0x30);return fg * sum;
}const int maxn = 1e5 + 10;
const int maxm = 33333 + 10;bitset<maxn> s[maxm];int len;
struct node {int l, r, id;bool operator < (const node &t) const {if (l / len == t.l / len) return r < t.r;return l < t.l;}
}op[maxn];int n, m, top, a[maxn], t[maxn], sum[maxn], cnt[maxn];void solve(int q) {top = 0;for (int i = 1; i <= q; i++) {int x1 = read(), y1 = read(), x2 = read(), y2 = read(), x3 = read(), y3 = read();sum[i] = y1 - x1 + y2 - x2 + y3 - x3 + 3;op[++top] = (node){x1, y1, i}, op[++top] = (node){x2, y2, i}, op[++top] = (node){x3, y3, i};s[i].set();}sort(op + 1, op + top + 1);int l = 1, r = 0;static bitset<maxn> now; now.reset();memset(cnt, 0, sizeof cnt);for (int i = 1; i <= top; i++) {int x = op[i].l, y = op[i].r, id = op[i].id;while (l > x) {--l;now.flip(a[l] + cnt[a[l]]);++cnt[a[l]];}while (r < y) {++r;now.flip(a[r] + cnt[a[r]]);++cnt[a[r]];}while (l < x) {--cnt[a[l]];now.flip(a[l] + cnt[a[l]]);++l;}while (r > y) {--cnt[a[r]];now.flip(a[r] + cnt[a[r]]);--r;}s[id] &= now;}for (int i = 1; i <= q; i++) printf("%d\n", sum[i] - s[i].count() * 3);
}int main() {
#ifdef xunzhenfreopen("bitset.in", "r", stdin);freopen("bitset.out", "w", stdout);
#endifn = read(), m = read(); len = sqrt(n);for (int i = 1; i <= n; i++) t[i] = a[i] = read();sort(t + 1, t + n + 1);for (int i = 1; i <= n; i++) a[i] = lower_bound(t + 1, t + n + 1, a[i]) - t;while (m) {int x = min(m, 33334);solve(x), m -= x;}return 0;
}

Summary

这算是我第一次接触\(bitset\)吧,它可以快速的完成大量的位运算操作,之后要多做点\(bitset\)的题找找感觉

转载于:https://www.cnblogs.com/xunzhen/p/9686161.html

BZOJ4939 [YNOI2016]掉进兔子洞相关推荐

  1. BZOJ4939[Ynoi2016]掉进兔子洞(莫队+bitset)

    题目链接 BZOJ 洛谷 扯点别的 听说这是比较亲民的一道Ynoi,于是我就去摸了一下,于是一个晚上就没了--不过至少还是学到了\(bitset\)维护可重集合的方法,以及当空间开不下时分组处理询问的 ...

  2. 【bzoj4939】【YNOI2016】掉进兔子洞(莫队)

    题目描述 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个 ...

  3. P4688-[Ynoi2016]掉进兔子洞【莫队,bitset】

    正题 题目链接:https://www.luogu.com.cn/problem/P4688 题目大意 给出一个长度为nnn的序列aaa. 然后mmm次询问给出三个区间,求这三个区间构成的可重集删去交 ...

  4. 《经济学人》也玩新奇,跟着爱丽丝掉进了兔子洞 | 经济学人全球早报精选

    文 / 王不留(微信公众号:考研英语笔记) 2021年10月26号的清晨,来杯"经济学人浓香咖啡",提神解困. Curiouser and curiouser: The Econo ...

  5. 《我是一只IT小小鸟》连载九——掉进读书的兔子洞(5)

    /*误打误撞,选择了出国深造*/ 掉进读书的兔子洞 徐宥 误打误撞,选择了出国深造 在找工作的同时,我出国的事情也没闲.我觉得直接靠寄材料申请计算机希望渺茫(我先前直接申请了几家数学和计算机,都是拒信 ...

  6. 【 MATLAB 】通过案例学会编写一个 matlab 函数(小猫掉进山洞问题)

    这是关于matlab学习的第一篇博文,我是不愿意承认自己不会MATLAB的,因为这东西大一的时候就学过,如果白驹过隙,都不好意思说自己研几了,科研的过程中MATLAB是必须要会的,于是得系统的看一下了 ...

  7. 【S操作】轻松优雅防止(解决)两次掉进同一坑的完美解决方案,arduino通知提醒方案...

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 搞技术,经常掉坑里是正常的,但掉进同一个坑两次就有点不能忍了,为了防止第三次掉坑,我 ...

  8. 【S操作】轻松优雅防止(解决)两次掉进同一坑的完美解决方案

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 搞技术,经常掉坑里是正常的,但掉进同一个坑两次就有点不能忍了,为了防止第三次掉坑,我 ...

  9. 人造卫星为什么会绕着地球转而不是停在太空中或者越飞越远.掉进地球的卫星为什么烧不完....

    人造卫星为什么会绕着地球转而不是停在太空中或者越飞越远.掉进地球的卫星为什么烧不完. 卫星被火箭推到太空中之后失去火箭的推动不就停在太空中或者因为惯性越飞越远了吗,为什么会绕着地球在椭圆形的轨道上飞? ...

最新文章

  1. 在神经网络中使用dropout
  2. es中的ResourceWatcherService
  3. android 增删改查 源码_学生信息增删改查小程序案例(springboot服务端)
  4. Makefile:条件编译
  5. php layout布局文件,layout(布局) - jQuery EasyUI中文文档 - EasyUI中文站
  6. clion中链接openssl库
  7. oracle数据库连接满了,ORACLE数据库连接数满的分析及优化
  8. 使用Roslyn将代码编译成单独的网络模块并将它们组装成动态库
  9. 酒店管理系统需求分析
  10. 怎么更换linux桌面管理,切换窗口管理器/桌面环境?
  11. 手机屏幕驱动板HDMI调光触摸旋转说明Fondar
  12. android 卸载残留代码,完全卸载AndroidStudio(示例代码)
  13. SQL Server数据库的管理及维护
  14. 导出excel.支持在线打开保存
  15. ICC学习——LAB1
  16. Magento开发文档(七):Magento EAV模型
  17. 修改Exchange2010 OWA登录时的企业logo
  18. 微信小程序开发学习第二天 按部就班的名片小程序
  19. Matlab求出图像中每个细胞的细胞核与核仁面积之比代码
  20. SilverLight合计行设计

热门文章

  1. 【Int. J. Mol. Sci.】黄瓜液泡转化酶基因CsVI1参与对低温胁迫的响应和己糖积累
  2. MIUI patchrom拉取zip包出错的解决记录
  3. - Wireless Network POJ - 2236
  4. oracle右键删除表格,Oracle删除表的几种方法
  5. 安徽师大附中%你赛day5 T3 树上行走 解题报告
  6. matlab绘图 作业,实验作业2 - -MATLAB作图
  7. Android之Keystore文件签名(获取查看apk签名)
  8. 项目Tips---使用阿里的OOS实现简单的文件上传
  9. mysql不能使用 mysql -u root -p 启动报错解决
  10. [每天一个知识点]12-Maven怎么读