luogu

我们要求的答案应该是三个区间长度\(-3*\)在三个区间中都出现过的数个数

先考虑数列中没有相同的数怎么做,那就是对三个区间求交,然后交集大小就是要求的那个个数.现在有相同的数,考虑给区间中的数安排位置,即区间中如果出现了多个相同的数\(x\),那么就把第一个\(x\)放在\(x\)这种数要放的第一个位置,把第二个\(x\)放在第二个对应位置,依次类推.具体的,我们用桶维护区间内所有数的出现次数,然后给每种数安排一个初始下标\(ps_x\),使得后面过程中放数不会重叠,如果数\(x\)出现了\(c\)次,那么就把另一个数组内\([ps_x,ps_x+c-1]\)这些位置记为1.那如果把一个询问的三个区间对应的状态数组取交,交集大小即为我们要的都出现过的数个数

求交集显然可以套bitset,然后询问若干区间信息再套个莫队,每次某个询问把三个区间的bitset并在另一个对应的bitset就行了.注意空间可能一次开不下,所以要把询问分成若干组去跑

#include<bits/stdc++.h>
#define LL long long
#define LLL __int128
#define db double using namespace std;
const int N=1e5+10,qsz=570;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,q,t,bl[N],a[N],b[N],cn[N],zq[N>>2],an[N>>2];
bitset<N> bb[N>>2],nb;
struct QR
{
int l,r,i;
bool operator < (const QR &bb) const {return bl[l]!=bl[bb.l]?bl[l]<bl[bb.l]:r<bb.r;}
}qq[N]; int main()
{
n=rd(),q=rd();
for(int i=1;i<=n;++i) bl[i]=i/qsz;
for(int i=1;i<=n;++i) a[i]=b[i]=rd();
sort(b+1,b+n+1),t=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i)
{
a[i]=lower_bound(b+1,b+t+1,a[i])-b;
++cn[a[i]+1];
}
for(int i=3;i<=t;++i) cn[i]+=cn[i-1];
for(int i=1,j=25000;i<=q;i+=25000,j+=25000)
{
j=min(j,q);
int tq=0;
for(int k=i,o=1;k<=j;++k,++o)
{
zq[o]=an[o]=0;
int l=rd(),r=rd();
an[o]+=r-l+1,qq[++tq]=(QR){l,r,o};
l=rd(),r=rd();
an[o]+=r-l+1,qq[++tq]=(QR){l,r,o};
l=rd(),r=rd();
an[o]+=r-l+1,qq[++tq]=(QR){l,r,o};
}
sort(qq+1,qq+tq+1);
qq[++tq]=(QR){n+1,n,0};
for(int k=1,l=1,r=0;k<=tq;++k)
{
while(r<qq[k].r){++r,++cn[a[r]],nb[cn[a[r]]]=1;}
while(r>qq[k].r){nb[cn[a[r]]]=0,--cn[a[r]],--r;}
while(l<qq[k].l){nb[cn[a[l]]]=0,--cn[a[l]],++l;}
while(l>qq[k].l){--l,++cn[a[l]],nb[cn[a[l]]]=1;}
if(!qq[k].i) continue;
if(!zq[qq[k].i]) bb[qq[k].i]=nb;
else bb[qq[k].i]&=nb;
++zq[qq[k].i];
}
for(int k=i,o=1;k<=j;++k,++o) printf("%d\n",an[o]-3*(int)bb[o].count());
}
return 0;
}

luogu P4688 [Ynoi2016]掉进兔子洞的更多相关文章

  1. luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队

    题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ...

  2. [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)

    [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...

  3. p4688 [Ynoi2016]掉进兔子洞

    传送门 分析 我们考虑先将所有数离散化 之后我们对于每个状态用一个bitset来记录 其中第i段表示颜色i的信息 对于每一段信息均是段首若干1,剩余若干0表示这种颜色有多少个 于是我们不难想到莫队 答 ...

  4. [洛谷P4688][Ynoi2016]掉进兔子洞

    题目大意:给定一个$n(n\leqslant10^5)$序列,$m(m\leqslant10^5)$个询问,每个询问给出$l_1,r_1,l_2,r_2,l_3,r_3$.令$s$为该三个区间的交集的 ...

  5. 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)

    题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ...

  6. [Ynoi2016]掉进兔子洞 题解

    题面传送门:https://www.luogu.org/problemnew/show/P4688 (温馨提示,请直接翻至题目描述部分) 1e5的数据范围,以及对区间每个权值出现次数取min此类主席树 ...

  7. BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)

    BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...

  8. BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)

    题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...

  9. 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 ...

随机推荐

  1. Oracle Database的基本概念

    一个 Oracle 服务器:是一个关系数据库管理系统(RDBMS),它提供全面的, 近乎完整的信息管理由Oracle 实例和Oracle 数据库组成Oracle 数据库 和 Oracle 实例Orac ...

  2. IPv4 ping命令

    IPv4 ping命令 一.Linux操作系统 给一台 Linux 主机分配了一个 IPv4 的 IP地址,如何使用 ping命令 确定该 IP地址 能否 ping 通呢? 1.查看主机的 IPv4 ...

  3. vagrant虚拟机共享目录在windows宿主下的禁忌

    问题背景 宿主环境:Windows10 开发环境:vagrant(ubuntu) 操作目录:synced_folder (共享目录 ) 执行命令:npm install 错误信息: npm ERR! ...

  4. 在DELPHI中动态创建控件以及控件的事件

    在DELPHI中我们经常要动态的创建控件以及控件的事件.例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作.这一般需要需要三步: 生成一 ...

  5. leetcode 257. 二叉树的所有路径 包含(二叉树的先序遍历、中序遍历、后序遍历)

    给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \2 3 \ 5 输出: ["1->2->5", & ...

  6. Hadoop集群安装压缩工具Snappy,用于Hbase

    最近项目中要用到Hadoop和Hbase,为了节省服务器的存储成本,并提高吞吐,安装并开启HBase的数据压缩为Snappy. 主流的HBase压缩方式有GZip | LZO | Snappy,Sna ...

  7. spring-boot集成8:集成shiro,jwt

    Shrio是一个轻量级的,基于AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权. JWT(JSON Web Token)是 ...

  8. UEFI+GPT下安装Win10和Ubuntu16.04双系统相关问题(引导、无线连不上网)

    1.安装双系统 1)先制作U盘启动,制作过程不再赘述 2)进入bios,设置从U盘启动 3)如下图,选择第二项为安装Ubuntu 4)前几不没什么问题,就直接往下走,选择语言,往下拉有中文选项 5)下 ...

  9. python字典操作+文件操作+函数

    师从百测besttest今天老牛教了些函数调用的知识,布置了个作业如下: # 1.写一个商品管理的小程序# 2.商品存在文件里面# 1.添加商品# 输入产品名称.颜色.价格# 要校验商品是否存在,价格 ...

  10. pandas的用法

    1.a = pandas.read_csv(filepath):读取.csv格式的文件到列表a中,文件在路径filepath中 pandas.core.frame.DataFrame是pandas的核 ...