https://www.lydsy.com/JudgeOnline/problem.php?id=4939

ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑ min(cnt1[i],cnt2[i],cnt3[i])*3

计算cnt可以用莫队

关键在与如何对3个区间取小

用bitset

假设5个数为               1 5 5 3 3

他们离散化之后为      1 4 4 2 2

那么1对应着bitset的第0位

区间里出现的第一个2对应着bitset的第1位

区间里出现的第二个2对应着bitset的第2位

区间里出现的第一个3对应着bitset的第3位

区间里出现的第二个3对应着bitset的第4位

区间[2,3]的bitset为     0 0 0 1 1

区间[3,4]的bitset为     0 1 0 1 0

这两个bitset执行 & 操作,得到 0 0 0 1 0

1的个数即为 ∑ min(cnt1[i],cnt2[i],cnt3[i])

#include<cmath>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 100000
#define T 25000 int a[N+],b[N+]; int S,bl[N+]; bitset<N>F[T+],f; int cnt[N+]; bool mark[T+];
int ans[T+]; struct node
{
int id,l,r;
}e[T*+]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp(node p,node q)
{
if(bl[p.l]!=bl[q.l]) return bl[p.l]<bl[q.l];
return p.r<q.r;
} void update(int pos,bool ty)
{
int x=a[pos];
if(ty)
{
cnt[x]++;
f[x+cnt[x]-]=;
}
else
{
f[x+cnt[x]-]=;
cnt[x]--;
}
} void solve(int t)
{
int n=;
memset(mark,false,sizeof(mark));
memset(ans,,sizeof(ans));
for(int i=;i<=t;++i)
{
read(e[++n].l); read(e[n].r);
e[n].id=i;
ans[i]+=e[n].r-e[n].l+;
read(e[++n].l); read(e[n].r);
e[n].id=i;
ans[i]+=e[n].r-e[n].l+;
read(e[++n].l); read(e[n].r);
e[n].id=i;
ans[i]+=e[n].r-e[n].l+;
}
sort(e+,e+n+,cmp);
f.reset();
memset(cnt,,sizeof(cnt));
int L=,R=;
for(int i=;i<=n;++i)
{
while(R<e[i].r) update(++R,true);
while(R>e[i].r) update(R--,false);
while(L<e[i].l) update(L++,false);
while(L>e[i].l) update(--L,true);
if(!mark[e[i].id]) F[e[i].id]=f,mark[e[i].id]=true;
else F[e[i].id]&=f;
}
for(int i=;i<=t;++i)
{
ans[i]-=F[i].count()*;
printf("%d\n",ans[i]);
}
} int main()
{
//freopen("xp1.in","r",stdin);
//freopen("xp1.ans","w",stdout);
int n,m;
read(n); read(m);
S=sqrt(n);
for(int i=;i<=n;++i) bl[i]=(i-)/S+;
for(int i=;i<=n;++i) read(a[i]),b[i]=a[i];
sort(b+,b+n+);
for(int i=;i<=n;++i) a[i]=lower_bound(b+,b+n+,a[i])-b;
while(m)
{
if(m<=T) solve(m),m=;
else solve(T),m-=T;
}
return ;
}

bzoj千题计划320:bzoj4939: [Ynoi2016]掉进兔子洞(莫队 + bitset)的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)

    容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...

  6. 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解

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

  7. bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...

  8. bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...

  9. bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋

    https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...

随机推荐

  1. MT【256】2016四川高考解答压轴题

    (2016四川高考数学解答压轴题)设函数$f(x)=ax^2-a-\ln x,a\in R$. 1)讨论$f(x)$的单调性;2)确定$a$的所有可能值,使得$f(x)>\dfrac{1}{x} ...

  2. python学习日记(生成器函数进阶)

    迭代器和生成器的概念 迭代器 对于list.string.tuple.dict等这些容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数.iter()是python内 ...

  3. [SCOI2005]王室联邦(构造)

    “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一 ...

  4. pandas to_excel

    报错:IllegalCharacterError 其原因是字段中包含了unicode字符. 解决方案: # 首先,安装python包xlsxwriter pip install xlsxwriter ...

  5. es6+的javascript拓展内容

    一.let,const 1.因为块级的作用域,这样打印01234,循环外打印i会报错 for (let i = 0; i < 5; i++) { setTimeout(console.log(i ...

  6. MySQL -- 单行函数

    大小写控制函数 SELECT LOWER('HelloWrold'), UPPER('HelloWorld'); 字符控制函数 SELECT REPLACE('abcdababab','p','m') ...

  7. A1064. Complete Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  8. undefined is not an object(evaluating '_react3.default.PropTypes.shape)

    手机红屏报这个错时的解决办法: npm uninstall --save react-native-deprecated-custom-components npm install --save ht ...

  9. long long

    1. ll a; scanf("%d",&a); 数据读入后,产生错误 2. const ll inf=1e18; 3. int * ll = ll ll * int = ...

  10. bcftools合并vcf文件

    见命令: bcftools merge A.vcf.gz B.vcf.gz C.vcf.gz -Oz -o ABC.vcf.gz 参考链接:http://vcftools.sourceforge.ne ...