YNOI2016:掉进兔子洞 (莫队+bitset)
YNOI2016:掉进兔子洞
题意简述:
有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立。 注意这里删掉指的是一个一个删,不是把等于这个值的数直接删完,比如三个区间是 $ [1,2,2,3,3,3,3] $ , $ [1,2,2,3,3,3,3] $ 与 $ [1,1,2,3,3] $ ,就一起扔掉了 $ 1 $ 个 $ 1 \(,\) 1 $ 个 $ 2 \(,\) 2 $ 个 $ 3 $ 。
$ solution: $
考场上觉得是毒瘤容斥+莫队(先求两两区间,得到三个区间),但是这道题不能这样容斥,有两个未知量。
其实重点就在于序列的存储的方式,然后就是我们对于莫队+ $ bitset $ 的熟悉度。我们知道如果相同元素在单个区间里只出现一次,那么我们直接对每个区间是否拥有某个元素二进制状压,然后三个区间与运算得到重复元素的信息(可以用 $ bitset $ 维护)。但是相同元素在单个区间里会出现多次,这个有一个很妙的维护方法:我们排序将相同元素放一块,然后对于每一段相同元素记录第一个位置,于是我们在 $ bitset $ 数组中就可以用对应的一段区间来维护这种相同元素出现次数(从区间第一个位置开始,每加入一个这个元素,就将后一个位置变为1)
然后多个 $ bitset $ 与运算,为一的位置说明在多个区间都有这个元素。对于区间的二进制状压信息,我们可以用莫队算法来求,因为对每个询问都要 $ bitset $ 数组,时间没问题但空间开不下,于是将询问分组做。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<bitset>
#define ll long long
#define rg register int
using namespace std;
int n,m,M,ff;
int a[100005];
int p[100005];
int A[100005];
int ans[100005];
bool vis[25005];
bitset<100005> b[25005],s;
struct su{
int x,y,id,v;
inline bool operator <(const su &i){
if(v==i.v){
if(v&1) return y<i.y;
return y>i.y; //奇偶分块优化常数
} return v<i.v;
}
}q[100005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
}
int main(){
n=qr(); M=m=qr(); ff=pow(n-1,0.5)+1; //分块
for(rg i=1;i<=n;++i) A[i]=a[i]=qr();
sort(A+1,A+n+1); //离散化,顺带把相同元素放一起并记录第一个位置
for(rg i=1;i<=n;++i) a[i]=lower_bound(A+1,A+n+1,a[i])-A;
while(M){
m=min(M,25000); M-=m; rg tt=0; //问询分组处理
for(rg i=1;i<=n;++i) p[a[i]]=a[i];
for(rg i=1;i<=m;++i){
rg l1=qr(),r1=qr(),l2=qr(),r2=qr(),l3=qr(),r3=qr();
ans[i]=r1+r2+r3-l1-l2-l3+3; vis[i]=0;
q[++tt]=su{l1,r1,i,(l1-1)/ff+1}; //最后一个元素分块
q[++tt]=su{l2,r2,i,(l2-1)/ff+1};
q[++tt]=su{l3,r3,i,(l3-1)/ff+1};
} sort(q+1,q+tt+1); //分块排序
rg l=1,r=0; s.reset();
for(rg i=1;i<=tt;++i){
rg x=q[i].x,y=q[i].y,id=q[i].id;
while(x<l)--l,s[p[a[l]]++]=1; //莫队
while(r<y)++r,s[p[a[r]]++]=1;
while(l<x)s[--p[a[l]]]=0,++l;
while(y<r)s[--p[a[r]]]=0,--r;
if(vis[id]) b[id]&=s; //&,三个集合都要有
else vis[id]=1,b[id]=s; //第一个直接覆盖(都不需要预处理)
}
for(rg i=1;i<=m;++i) //答案=总数-不合法数
printf("%d\n",ans[i]-(int)b[i].count()*3);
}
return 0;
}
YNOI2016:掉进兔子洞 (莫队+bitset)的更多相关文章
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)
题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ...
- bzoj千题计划320:bzoj4939: [Ynoi2016]掉进兔子洞(莫队 + bitset)
https://www.lydsy.com/JudgeOnline/problem.php?id=4939 ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑ min(cnt1[i ...
- BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)
容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...
- BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ...
随机推荐
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第1节 基本概念_02maven依赖管理的概念
传统的web项目jar放在项目中,占用磁盘空间 maven项目里面只保存jar包的坐标.jar包文件都在仓库中.扎包重用都在jar包仓库中.
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_18_注解_案例_简单的测试框架
定义计算器的类 用注解的方式去测试计算器类里面 所有的方法 想验证哪个方法 就在方法的上面加上注解@check 执行TestCheck验证方法 控制台的输出 根目录生成了一个 bug.txt文件 重写 ...
- Spring 注解概览
从Java5.0开始,Java开始支持注解.Spring做为Java生态中的领军框架,从2.5版本后也开始支持注解.相比起之前使用xml来配置Spring框架,使用注解提供了更多的控制Spring框架 ...
- IDEA无法导入HttpServlet包解决方法
1.maven项目 直接在pom.xml中添加对java servlet api的依赖即可,比较常用的一个servlet版本3.1.0的依赖如下: <!-- https://mvnreposit ...
- LeetCode.874-走路机器人模拟(Walking Robot Simulation)
这是悦乐书的第335次更新,第360篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第205题(顺位题号是874).网格上的机器人从点(0,0)开始并朝北.机器人可以接收三 ...
- HDU4372(第一类斯特林数)
题意:N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数. 0 < N, F, B <= 2000 首先我们知道一个结论:n的环排列的 ...
- 浅谈JVM及原理
前言 JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点. 运行流程 我们都 ...
- Git 的使用及其一些基本用法
打开你的git-bash 绑定用户和邮箱作为标识 $ git config --global user.name "your name" $ git config --global ...
- MySQL-快速入门(9)视图
1.什么是视图 视图是一个虚表.视图可以进行查询.增加.修改.删除.进行修改.增加.删除,将影响基本表中的数据. 2.视图相对基本表的优势 1>简单化:看到的就是想要的字段列,可以简化后续查询. ...
- Java中HashMap扩容机制思考
1. HashMap在什么条件下扩容 判断HashMap的数组Size大小如果超过loadFactor*capacity,就要扩容. 相关的类属性: capacity:当前数组容量,始终保持 2^n, ...