题面传送门:https://www.luogu.org/problemnew/show/P4688

(温馨提示,请直接翻至题目描述部分)

1e5的数据范围,以及对区间每个权值出现次数取min此类主席树才能解决的操作会让我们想到莫队;

三个区间取交集的操作会让我们想到bitset。

然而同个数值在多个位置出现需要分别计算,这点让我们对于使用bitset产生了怀疑。

但实际上我们可以利用一个小trick来解决这个问题,那就是利用不寻常的离散化,就是sort之后不用unique,让bitset每一位不只代表数值,还代表这个数值出现的次数。

这样我们莫队的时候,对于当前区间维护一个桶cnt,记录每个离散化后的权值在此区间出现的次数,和一个bitset,维护权值及权值出现的次数信息。然后三个区间的bitset取交,再用三个区间的长度和减去交集1的个数就是答案。

具体实现请看代码:

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);++i)
const int N =100505;
const int M =33350;
int n,m,blo[N],K,a[N],R;
struct la{int l,r,id;}ask[N];
bitset<N> ans[M],now;
int cnt[N],p[N],tot;
bool cmp(la x,la y){
return blo[x.l]==blo[y.l]?x.r<y.r:blo[x.l]<blo[y.l];
}
inline void del(int x){cnt[x]--;now[x-cnt[x]]=0;}
inline void add(int x){now[x-cnt[x]]=1;cnt[x]++;}
void doit(int y){
tot=0;
rep(i,1,y)p[i]=0;
rep(i,1,y){
++tot;scanf("%d%d",&ask[tot].l,&ask[tot].r);p[i]+=ask[tot].r-ask[tot].l+1;
++tot;scanf("%d%d",&ask[tot].l,&ask[tot].r);p[i]+=ask[tot].r-ask[tot].l+1;
++tot;scanf("%d%d",&ask[tot].l,&ask[tot].r);p[i]+=ask[tot].r-ask[tot].l+1;
ask[tot].id=ask[tot-1].id=ask[tot-2].id=i;
}
sort(ask+1,ask+tot+1,cmp);
int l=1,r=0;
rep(i,1,y)ans[i].set();//不用带参,直接全置为 1
rep(i,1,tot){
while(ask[i].l<l)add(a[--l]);
while(ask[i].r>r)add(a[++r]);
while(ask[i].l>l)del(a[l++]);
while(ask[i].r<r)del(a[r--]);
ans[ask[i].id]&=now;
}
while(l<=r)del(a[l++]);
rep(i,1,y)printf("%d\n",p[i]-3*(int)ans[i].count());
}
int main(){
scanf("%d%d",&n,&m);K=sqrt(n)+1;
rep(i,1,n)scanf("%d",&a[i]),p[i]=a[i],blo[i]=(i-1)/K+1;
sort(p+1,p+n+1);
rep(i,1,n)a[i]=upper_bound(p+1,p+n+1,a[i])-p-1;
R=m/3;
if(R)doit(R);
if(R)doit(R);
doit(m-2*R);
return 0;
}

[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. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

    题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...

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

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

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

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

  6. BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ...

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

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

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

    传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...

  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. 笔记本光驱位换SSD固态硬盘之硬盘格式化

    笔记本光驱位换SSD固态硬盘之硬盘格式化 系列文章: ThinkPad E430c加装内存和SSD固态硬盘 笔记本光驱位换SSD固态硬盘之Ghost克隆原来的系统到SSD固态硬盘分区 概述 加装SSD ...

  2. 尝试create tech team

    自从上一家公司之后,我很少有机会去带一些新人(公司一般都招一些技术独立性的工程师),特别是经验不是特别多的新小伙伴.在如今管理扁平化的公司,我正逐渐搭建自己的小team,并试图让团队成员快速融入并成长 ...

  3. Django訪问量和页面PV数统计

    http://blog.csdn.net/pipisorry/article/details/47396311 以下是在模板中做一个简单的页面PV数统计.model阅读量统计.用户訪问量统计的方法 简 ...

  4. Ext.tree.Panel实现单选,多选

    Extjs var productCategoryTreeLookUpFn = function(callback) { var productCategoryLookUpWindow; var pr ...

  5. linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一【转】

    本文转载自:http://blog.csdn.net/radianceblau/article/details/64125411 目前linux中主流的音频体系结构是ALSA(Advanced Lin ...

  6. elasticsearch _field_stats 源码分析

    _field_stats 实现的功能:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/search-field-stats.ht ...

  7. Java 8 实战 P4 Beyond Java 8

    目录 Chapter 13. Thinking functionally Chapter 14. Functional programming techniques Chapter 15. compa ...

  8. Appium - 命令行参数

    1.cmd端口输入,appium -help参考帮助信息 2.Appium - 命令行参数 参数 默认 描述 举个例子 --shell 空值 进入REPL模式   --ipa 空值 (仅限IOS)ab ...

  9. java 关键字与保留字

    Java 关键字列表 (依字母排序 共51组),所有的关键字都是小写,在MyEclipse中都会显示不同的颜色: abstract, assert,boolean, break, byte, case ...

  10. HTML <!DOCTYPE>标签 各版本对应的标签是否有无

    参考来源: http://www.w3school.com.cn/tags/html_ref_dtd.asp HTML5/HTML 4.01/XHTML 元素和有效的 DTD 下面的表格列出了所有的 ...