BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
解题思路
刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够。。试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做。。这道题做法具体来说就是开\(3\)个\(bitset\),然后对原序列离散化之后给每个值规定一个开始的位置,之后就可以莫队搞,计算答案是用总的元素个数减去扔掉的,而扔掉的其实就是三个\(bitset\)做与运算后\(1\)的个数,时间复杂度\(O(n\sqrt n+\frac{n^2}{w})\)。\(bzoj\)上时限\(80s\)跑了\(80s\),荣获倒一。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const int M=10000;
inline int rd(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,m,a[N],cpy[N],pos[N],u,b[N],siz,num,slen[N];
int ll[N][4],rr[N][4];
struct Data{
int l,r,id,type;
friend bool operator<(const Data A,const Data B){
if(A.l/siz!=B.l/siz) return A.l<B.l;
if((A.l/siz)&1) return A.r>B.r;
return A.r<B.r;
}
Data(int _l=0,int _r=0,int _id=0,int _type=0){
l=_l; r=_r; id=_id; type=_type;
}
}q[N*3];
bitset<N> f[3][10010],g;
#define Add(x) g.set(pos[a[(x)]]++)
#define Del(x) g.reset(--pos[a[(x)]])
void solve(int l,int r){
int tot=0;
for(int i=1;i<=n;i++)
if(b[i]!=b[i-1]) pos[b[i]]=i;
for(int i=l;i<=r;i++){
q[++tot]=Data(ll[i][0],rr[i][0],i-l+1,0);
q[++tot]=Data(ll[i][1],rr[i][1],i-l+1,1);
q[++tot]=Data(ll[i][2],rr[i][2],i-l+1,2);
}
sort(q+1,q+1+tot);
int L=1,R=0; g.reset();
for(int i=1;i<=tot;i++){
while(L>q[i].l) L--,Add(L);
while(R<q[i].r) R++,Add(R);
while(L<q[i].l) Del(L),L++;
while(R>q[i].r) Del(R),R--;
f[q[i].type][q[i].id]=g;
}
for(int i=1;i<=r-l+1;i++){
printf("%d\n",(slen[i+l-1]-3*((f[0][i]&f[1][i]&f[2][i]).count())));
f[0][i].reset(); f[1][i].reset(); f[2][i].reset();
}
}
int main(){
n=rd(),m=rd(); int l1,r1,l2,r2,l3,r3;
for(int i=1;i<=n;i++) a[i]=cpy[i]=rd();
sort(cpy+1,cpy+1+n); siz=sqrt(n);
u=unique(cpy+1,cpy+1+n)-cpy-1;
for(int i=1;i<=n;i++)
a[i]=lower_bound(cpy+1,cpy+1+u,a[i])-cpy;
memcpy(b,a,sizeof(b)); sort(b+1,b+1+n);
for(int i=1;i<=m;i++){
l1=rd(),r1=rd(),l2=rd(),r2=rd(),l3=rd(),r3=rd();
ll[i][0]=l1,ll[i][1]=l2,ll[i][2]=l3;
rr[i][0]=r1,rr[i][1]=r2,rr[i][2]=r3;
slen[i]=r1-l1+1+r2-l2+1+r3-l3+1;
}
for(int i=1;i<=m;i+=M)
solve(i,min(m,i+M-1));
return 0;
}
BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)的更多相关文章
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...
- BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ...
- 洛谷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 ...
随机推荐
- debian下安装mysql 5.1.34
#cd /usr/local/src # tar xvzf mysql-5.1.34.tar.gz # cd mysql-5.5.1.34 配置和编译 #chmod +x configure # ./ ...
- DB.JDBC_jar_下载
1.Download Microsoft JDBC Driver for SQL Server - SQL Server _ Microsoft Docs.html(https://docs.micr ...
- Node.js实战1:创建一个新的Node项目。
你也许在猜专业的Node开发如何创建一个新项目. 有Npm在 ,这会非常简单. 虽然你可以创建一个JS文件,并执行:node file.js,但我建议你使用npm init来先创建一个node项目,这 ...
- [19/10/16-星期四] Python中的文件操作
一.打开文件 # open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, ...
- 正反向代理、负载均衡、Nginx配置实现
一.正反向代理 1.前提 我们曾经使用翻墙软件,访问google:使用了代理软件时,需要在浏览器选项中配置代理的地址,我们仅仅有代理这个概念,并不清楚代理还有正向和反向之分. 2.正向代理(代替客户端 ...
- CentOS7 硬盘检测
一.测试硬盘健康状态 安装相关工具:yum -y install smartmontools SMART是一种磁盘自我分析检测技术,早在90年代末就基本得到了普及每一块硬盘(包括IDE.SCSI),在 ...
- 在SSIS包中使用 Checkpoint从失败处重新启动包[转]
使用SSIS做ETL的过程中会遇到各种各样的错误,对于一些大数据量的Job失败以后我们不希望重新运行,因为重新运行的时间开销是非常大的,我们只希望从失败的部分开始运行,这样可以省去很多的时间. SSI ...
- Charles的app抓包配置和抓包节点为unknown、乱码、手机无法上网等问题的处理
关于手机端抓包配置Charles的一些配置,并且解决,请求存在unknown和内容为乱码的问题 关于请求节点为unknown.内容为乱码和手机端无法访问网络其实都是手机端证书配置问题导致,有的配置后还 ...
- 小明种苹果(续)第十七次CCF认证
小明种苹果(续)第十七次CCF认证 题目 原题链接 ](http://118.190.20.162/view.page?gpid=T93) 很高心,在现在CCF CSP可以下载自己当时的答卷了,也就是 ...
- OC中数组排序的3种方法
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 大体上 ...