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 ...
随机推荐
- 【Linux开发】【Qt开发】tslibs的配置(触摸屏没有,HDMI屏幕):Qt界面响应USB鼠标
s3c2416 linux qt4.x 由于触摸屏坏了,板子只能用鼠标了,结果以前可以用的现在鼠标突然不能用了 为此交叉编译了qt的多个版本,也换过根文件系统,以为是tslib版本的问题,却发现q ...
- Centos 安装Jenkins的坎坷
安装Jenkins(简单复制即可) wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.rep ...
- TFS 删除工作区签出状态
'//找出当前工作组未迁出的文件 delete tbl_pendingchange '
- 第二周JAVA总结
学海无涯,在学习这件事情上得用点心了
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
字符数组的长度计算:必须以终止符’\0'作为边界,但对字符数组赋值时,有两种方式: 1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'} ...
- 运用swagger编写api文档
一.什么是swagger 随着互联网技术的发展,前后端技术在各自的道路上越走越远,他们之间的唯一联系变成了api接口,api接口文档编程了前后端人员的纽带,而swagger就是书写api文档的一款框架 ...
- eclipse调试openstack的nova代码
前段时间一直在研究openstack的nova部分的代码.特别想知道,怎样用eclipse来调试代码.也在论坛上问了别人.无果.最后还是自己摸索出了出路. 以下写出自己探索之路.我是用devstack ...
- leetcode第一题(easy)
第一题:题目内容 Given an array of integers, return indices of the two numbers such that they add up to a sp ...
- 防抖&节流
使用的原因 在前端开发当中有一部分的用户行为会频繁操作触发事件执行,而对于DOM操作,资源加载等耗费性能的处理,很可能导致页面卡顿,甚至浏览器崩溃,函数节流和防抖就是解决类似需求应运而生的 节流 预定 ...
- 七、latex中的插图