bzoj4939: [Ynoi2016]掉进兔子洞
将权值排序,设权值x排序后在[l,r]出现,x在区间中出现k次,则用[l,l+k-1]为1,[l+k,r]为0来表示x的出现次数
用bitset表示可重集中每个元素的出现次数,用莫队处理出询问区间对应的bitset,通过取and后求1的个数得到答案
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
typedef unsigned int u32;
typedef u32 bits[];
const int N1=,N=N1*;
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
int n,m,v[N],vs[N];
struct Q{
int l,r,id;
}qs[N];
int pos[N],ps[N];
bool operator<(Q a,Q b){
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
if(a.r!=b.r)return (a.r<b.r)^(pos[a.l]&);
return ;
}
int qp=;
int qt[N],ans[N];
bits now,xs[N1];
void _flip(bits a,int x){a[x>>]^=<<(x&);}
void _clr(bits a){memset(a,,sizeof(int)*(n/+));}
void ins(int x){_flip(now,ps[x]++);}
void del(int x){_flip(now,--ps[x]);}
void _and(bits a,bits b){
int mx=n/+;
for(int i=;i<mx;i+=){
a[]&=b[];
a[]&=b[];
a[]&=b[];
a[]&=b[];
a[]&=b[];
a[]&=b[];
a[]&=b[];
a[]&=b[];
a+=,b+=;
}
}
int c1[];
int _and_c1(bits a,bits b){
int mx=n/+,s1=,s2=,s3=;
for(int i=;i<mx;++i){
u32 x=a[i]&b[i];
s1+=c1[x>>];
s2+=c1[x>>&];
s3+=c1[x&];
}
return s1+s2+s3;
}
void calc(){
int B=n/sqrt(qp)+;
for(int i=;i<n;++i)pos[i]=i/B,ps[v[i]]=v[i];
_clr(now);
for(int i=;i<qp/;++i)qt[i]=;
std::sort(qs,qs+qp);
int L=,R=;
for(int i=;i<qp;++i){
int l=qs[i].l,r=qs[i].r,id=qs[i].id;
while(R<r)ins(v[++R]);
while(L>l)ins(v[--L]);
while(R>r)del(v[R--]);
while(L<l)del(v[L++]);
int t=++qt[id];
if(t==)memcpy(xs[id],now,sizeof(int)*(n/+));
else if(t==)_and(xs[id],now);
else ans[id]-=_and_c1(xs[id],now)*;
}
for(int i=;i<qp/;++i)printf("%d\n",ans[i]);
qp=;
}
int main(){
for(int i=;i<;++i)c1[i]=c1[i>>]+(i&);
n=_(),m=_();
for(int i=;i<n;++i)v[i]=vs[i]=_();
std::sort(vs,vs+n);
for(int i=;i<n;++i)v[i]=std::lower_bound(vs,vs+n,v[i])-vs;
for(int i=;i<m;++i){
ans[qp/]=;
for(int j=;j<;++j){
qs[qp].l=_()-;
qs[qp].r=_()-;
qs[qp].id=qp/;
ans[qs[qp].id]+=qs[qp].r-qs[qp].l+;
++qp;
}
if(qp>=(N1-)*||i+==m)calc();
}
return ;
}
bzoj4939: [Ynoi2016]掉进兔子洞的更多相关文章
- BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)
容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...
- 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 ...
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...
- p4688 [Ynoi2016]掉进兔子洞
传送门 分析 我们考虑先将所有数离散化 之后我们对于每个状态用一个bitset来记录 其中第i段表示颜色i的信息 对于每一段信息均是段首若干1,剩余若干0表示这种颜色有多少个 于是我们不难想到莫队 答 ...
- [洛谷P4688][Ynoi2016]掉进兔子洞
题目大意:给定一个$n(n\leqslant10^5)$序列,$m(m\leqslant10^5)$个询问,每个询问给出$l_1,r_1,l_2,r_2,l_3,r_3$.令$s$为该三个区间的交集的 ...
- BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ...
随机推荐
- 项目报错 exception 'RedisException' with message 'Redis server went away' in XXX
检查服务器防火墙是否开启redis端口:如果返回no 表没确实没开 firewall-cmd --query-port=6379/tcp 开启:firewall-cmd --add-port=6379 ...
- LSOF查看linux中文件打开情况
如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...
- .closest 样例收集
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 【java多线程】队列系统之LinkedBlockingQueue源码
转载:https://blog.csdn.net/tonywu1992/article/details/83419448 http://benjaminwhx.com/archives/ 1.简介 上 ...
- #define vs. const vs enum
In one word, using const is better than define. enum is the best. There are lots of discussions. I p ...
- SAS常用函数
SAS常用函数 一.数学函数 ABS(x) 求x的绝对值. MAX(x1,x2,…,xn) 求所有自变量中的最大一个. MIN(x1,x2,…,xn) 求所有自变量中的最小一个. MOD(x,y) ...
- python之路---12 生成器 推导式
三十.函数进阶 1.生成器 函数中有yield 的就是生成器函数(替代了return) 本质就是迭代器 一个一个的创建对象 节省内存 ①创建生成器 最后以yield结束 ...
- Centos6 rpm 安装mysql5.5(转)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/macfac/article/details/51868712 0. 到官网下载好,想要安装的rpm包 ...
- hdu 1693 Eat the Trees——插头DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693 第一道插头 DP ! 直接用二进制数表示状态即可. #include<cstdio> # ...
- Kafka 基本概念学习笔记
一. 什么是Kafka 面向数据流的生产,转换,存储,消费的整体流处理平台 二.Kafka三大特性 1.发布和订阅数据的流,类似于消息队列,消息系统 2..数据流存储平台 3.当数据产生的时候,对数据 ...