题目链接

BZOJ

洛谷

扯点别的

听说这是比较亲民的一道Ynoi,于是我就去摸了一下,于是一个晚上就没了……不过至少还是学到了\(bitset\)维护可重集合的方法,以及当空间开不下时分组处理询问的花操作……

解析

大佬们说容易想到bitset,那就想到bitset吧……

这种形如“几个集合共同含有的元素”的问题容易让人想\(bitset\)搞一搞,但是我们发现裸的\(bitset\)只能表示有没有,不能表示有多少,下面就是神奇的让\(bitset\)能表示有多少的方法

就这道题而言首先肯定是离散化,但是离散化时我们不去重,这样相同元素会是连续的一段,我们取第一个出现的位置作为离散化后的值,简单举个例子:1,4,2,4,4,5 => hash[1] = 0,hash[2] = 1,hash[4] = 2,hash[5] = 5

假设我们要加入一个数\(x\),它之前已经在这个集合中出现了\(cnt\)次,那么我们把\(x + cnt\)那一位置为\(1\),删除同理,即:bitset中第\(i + j\)个位置表示数字\(i\)第\(j + 1\)次出现

这样当我们把每个\(bitset\)与起来就相当于对每个数的出现次数取了个\(min\)

回到题目,假设我们知道了三个区间的\(bitset\)与起来是\(S\),那么答案显然就是\(len1 + len2 + len3 - |S| \times 3\)

我们发现\(bitset\)加入和删除都能很快处理,询问的又是区间,那么就可以上莫队试试了,莫队的时候维护一下每个数出现的次数即可

还有一点,直接开\(1e5\)个\(bitset\)肯定开不下,于是我们把询问分组,每组上一次莫队即可

分组大小可以算算,我比较懒就从\(1e4\)开始试然后到\(3e4\)的时候就过了……

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <bitset>
#include <algorithm>
#define MAXN 100003
#define belong(x) ((x) / per_block)typedef long long LL;
struct Query {int l, r, id;
} qry[90005];
int arr[MAXN], hash[MAXN], cnt[MAXN], N, M, per_block, idx;
std::bitset<MAXN> cur, ans[30003];
bool vis[30003];bool operator <(const Query &q1, const Query &q2) {return belong(q1.l) == belong(q2.l) ? q1.r < q2.r : belong(q1.l) < belong(q2.l);
}
bool cmp(const Query &q1, const Query &q2) { return q1.id < q2.id; }int main() {scanf("%d%d", &N, &M);for (int i = 0; i < N; ++i) scanf("%d", arr + i), hash[i] = arr[i];std::sort(hash, hash + N);for (int i = 0; i < N; ++i)arr[i] = std::lower_bound(hash, hash + N, arr[i]) - hash;while (per_block * per_block < N) ++per_block;while (M) {memset(cnt, 0, sizeof cnt);memset(vis, 0, sizeof vis);cur.reset();int tot = std::min(30000, M);for (int k = 0; k < tot * 3; ++k) scanf("%d%d", &qry[k].l, &qry[k].r), qry[k].id = k / 3;std::sort(qry, qry + tot * 3);for (int l = 0, r = -1, i = 0; i < tot * 3; ++i) {--qry[i].l, --qry[i].r;while (r < qry[i].r) ++r, cur[arr[r] + cnt[arr[r]]] = 1, ++cnt[arr[r]];while (r > qry[i].r) --cnt[arr[r]], cur[arr[r] + cnt[arr[r]]] = 0, --r;while (l < qry[i].l) --cnt[arr[l]], cur[arr[l] + cnt[arr[l]]] = 0, ++l;while (l > qry[i].l) --l, cur[arr[l] + cnt[arr[l]]] = 1, ++cnt[arr[l]];if (!vis[qry[i].id]) vis[qry[i].id] = 1, ans[qry[i].id] = cur;else ans[qry[i].id] &= cur;}std::sort(qry, qry + tot * 3, cmp);for (int i = 0; i < tot; ++i) {int p1 = i * 3, p2 = p1 + 1, p3 = p2 + 1;printf("%d\n", qry[p1].r - qry[p1].l + qry[p2].r - qry[p2].l + qry[p3].r - qry[p3].l + 3 - (int)ans[i].count() * 3);}M -= tot;}return 0;
}
//Rhein_E

转载于:https://www.cnblogs.com/Rhein-E/p/10506971.html

BZOJ4939[Ynoi2016]掉进兔子洞(莫队+bitset)相关推荐

  1. BZOJ4939 [YNOI2016]掉进兔子洞

    题目蓝链 Solution 首先,很显然这题是要用莫队来处理的.我们先把输入的数字另外排一下序,然后记录一下\(p_i\)表示每一个数字对应在排好序的数列里面是排第几个.询问的时候要把一个询问拆成\( ...

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

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

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

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

  4. P5355-[Ynoi2017]由乃的玉米田【莫队,bitset,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/P5355 顺带一提的是P3674 小清新人渣的本愿是这题的弱化版,提交就可以A 题目大意 nnn个数字,询问 一个区 ...

  5. BZOJ 4810 [Ynoi2017]由乃的玉米田(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4810 [题目大意] 给出一个数列,有三种区间查询, 分别查询区间是否存在两个数乘积为x ...

  6. P3674 小清新人渣的本愿 (莫队 + bitset)

    题目链接: P3674 小清新人渣的本愿 大致题意 给定一个长度为 n n n的序列, 有 m m m次询问操作. 1 l r x 表示询问 [ l , r ] [l, r] [l,r]是否存在 a ...

  7. 小清新人渣的本愿(莫队+bitset)

    小清新人渣的本愿 这两天写了些 b i t s e t bitset bitset的题,但都不想写题解...正巧这道题还结合了莫队,也是正在学习的,就记录一下吧. 题意: 给定一个 a a a数组,有 ...

  8. 洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

    传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ...

  9. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)

    Description 由乃在自己的农田边散步,她突然发现田里的一排玉米非常的不美.这排玉米一共有N株,它们的高度参差不齐. 由乃认为玉米田不美,所以她决定出个数据结构题 这个题是这样的: 给你一个序 ...

最新文章

  1. 复习笔记(四)——C++内联函数
  2. 怎样检查python环境是否安装好_如何搭建pytorch环境的方法步骤
  3. VS 2005 不能调试无法找到调试信息 未使用调试信息生成二进制文件
  4. ASP.NET AJAX Preview 2
  5. AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密
  6. 问题 1: 区间交集
  7. github的应用详解
  8. LOCK TABLES
  9. 利用通用权限管理系统底层解决数据从不同库的导入导出问题
  10. java案例代码16-java正则表达式的使用
  11. java二进制的相关知识_java二进制运算基础知识点详解
  12. 简单的U盘病毒清理工具 v0.5
  13. 百度硬盘邀请码在放送
  14. 手持式以太网测试仪RFC2544测试演示
  15. TypeScript瞎看看
  16. Elasticsearch:从搜索中获取选定的字段 fields
  17. 梅特勒托利多xk3124电子秤说明书_托利多电子秤说明书
  18. opencv物体识别-识别水果
  19. 1080P or 4K?——明基 TK800M 4K HDR家用投影体验
  20. Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)...

热门文章

  1. MongoDB 访问控制
  2. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)
  3. Windows 2000/XP/2003超级工具
  4. 人民大学云计算编程的网上评估平台--解题报告 1001-1003
  5. git下载指定分支代码到本地
  6. Linux开关机命令:shutdown,reboot,halt,init之间的区别
  7. main 函数的标准原型
  8. 常考数据结构与算法-manacher算法
  9. 操作系统五: 非连续内存分配
  10. 美空管官员:政府停摆致人手不足 危及航空安全