BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
删掉的数即三个区间数的并,想到bitset;查多个区间的数,想到莫队。
考虑bitset的每一位如何对应每个数的不同出现次数。只要离散化后不去重,每次记录time就可以了。
但是如果对所有询问开一个bitset会MLE。但是我们可以开M个bitset,每次处理M次询问。
注意莫队修改时要先Add后Subd,否则tm在中间会出现负值导致RE。原来更新顺序会这样...
//309796kb 58456ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <bitset>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e5+5,M=25000;
int n,m,bel[N],ref[N],A[N],ans[M+3],L[N],R[N],cnt[N];
bool vis[M+3];
std::bitset<N> now,f[M+3];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Quries
{
int l,r,id;
bool operator <(const Quries &x)const{
return bel[l]==bel[x.l]?r<x.r:bel[l]<bel[x.l];
}
}q[(M+3)*3];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Find(int x)
{
int l=1,r=n,mid;
while(l<r)
if(ref[mid=l+r>>1]<x) l=mid+1;
else r=mid;
return l;
}
inline void Add(int x)
{
now[x+cnt[x]]=1, ++cnt[x];
}
inline void Subd(int x)
{
--cnt[x], now[x+cnt[x]]=0;
}
void Solve(int tot)
{
memset(vis,0,sizeof vis);//...
memset(cnt,0,sizeof cnt);
int t=0;
for(int i=0,l1,r1,l2,r2,l3,r3; i<tot; ++i)
{
vis[i]=0;
l1=read(),r1=read(),l2=read(),r2=read(),l3=read(),r3=read();
q[t++]=(Quries){l1,r1,i}, q[t++]=(Quries){l2,r2,i}, q[t++]=(Quries){l3,r3,i};
ans[i]=r1-l1+r2-l2+r3-l3+3;
}
std::sort(q,q+t), now.reset();
for(int i=0,l=1,r=0; i<t; ++i)
{
int ln=q[i].l,rn=q[i].r;
while(l>ln) Add(A[--l]);
while(r<rn) Add(A[++r]);
while(l<ln) Subd(A[l++]);
while(r>rn) Subd(A[r--]);
if(!vis[q[i].id]) f[q[i].id]=now, vis[q[i].id]=1;
else f[q[i].id]&=now;
}
for(int i=0; i<tot; ++i) printf("%d\n",ans[i]-f[i].count()*3);
}
int main()
{
n=read(), m=read(); int size=sqrt(n);
for(int i=1; i<=n; ++i) ref[i]=A[i]=read(),bel[i]=i/size;
std::sort(ref+1,ref+1+n);
for(int i=1; i<=n; ++i) A[i]=Find(A[i]);
while(m>=M) Solve(M),m-=M;
if(m) Solve(m);
return 0;
}
BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)的更多相关文章
- BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...
- [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 ...
- bzoj4939: [Ynoi2016]掉进兔子洞
将权值排序,设权值x排序后在[l,r]出现,x在区间中出现k次,则用[l,l+k-1]为1,[l+k,r]为0来表示x的出现次数 用bitset表示可重集中每个元素的出现次数,用莫队处理出询问区间对应 ...
- luogu P4688 [Ynoi2016]掉进兔子洞
luogu 我们要求的答案应该是三个区间长度\(-3*\)在三个区间中都出现过的数个数 先考虑数列中没有相同的数怎么做,那就是对三个区间求交,然后交集大小就是要求的那个个数.现在有相同的数,考虑给区间 ...
随机推荐
- C语言复习---零散补充
一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...
- Shell中的case命令
case语句和判断语句[if...elif...else]功能类似;当在逻辑判断比较简单的情况下,比后者的代码量要少许多.case用法,用变量来匹配某值,如果匹配成功则执行它下面的命令,直到 ::为止 ...
- bzoj千题计划175:bzoj1303: [CQOI2009]中位数图
http://www.lydsy.com/JudgeOnline/problem.php?id=1303 令c[i]表示前i个数中,比d大的数与比d小的数的差,那么如果c[l]=c[r],则[l+1, ...
- 8个提高效率的CSS实用工具
CSS,也就是Cascading Style Sheets,推出于1997年,差不多是17年前,至此为我们开发网页大开方便之门,协助我们制作出一个又一个惊艳绝伦的网站设计和模板,提升了我们的创造能力, ...
- 20155232 2016-2017-3 《Java程序设计》第8周学习总结
20155232 2016-2017-3 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO使用频道来衔接数据结点,在处理数据时,NIO可以让你设定缓冲 ...
- nmap - 网络扫描
NMap,Network Mapper 最早是Linux下的网络扫描和嗅探工具包 网络链接扫描; nmap -PT 192.168.1.1-111 # 先ping在扫描主机开放端口 nmap -O 1 ...
- 【C语言】十六进制形式输出应用程序
1.前言 最近在看到同事写了一款封印病毒的程序,非常有意思!原理大致是将PE文件中的ASCII转换成HEX输出到文本中.这样做的目的是为了保存病毒样本的时候不会被杀毒软件查杀!然而却是delphi写的 ...
- 数据库SQL中case when函数的用法
Case具有两种格式,简单Case函数和Case搜索函数.这两种方式,可以实现相同的功能.简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式. 简单Cas ...
- 输入操作遇到unknown error: cannot focus element
事件背景:写脚本遇到sendkey时报错unknown error: cannot focus element,仔细查了,元素定位什么的都没问题,通过js注入修改数据后,保存成功,但是再进入编辑状态查 ...
- css-通过hover实现鼠标进过背景色变化
通过hover实现鼠标进过背景色变化 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...