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. 【XSY2470】lcm 数学

    题目大意 \(t\)组询问, 每组询问给定\(n\),求\(\sum_{k=1}^n[n,k]\),其中\([a,b]\)表示\(a\)和\(b\)的最小公倍数 . \(t\leq 300000,n\ ...

  2. 多项式细节梳理&模板(多项式)

    基础 很久以前的多项式总结 现在的码风又变了... FFT和NTT的板子 typedef complex<double> C; const double PI=acos(-1); void ...

  3. Hdoj 1233.还是畅通工程 题解

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...

  4. Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  5. [POI2007]ODW-Weights(贪心)

    在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数 ...

  6. Codeforces Round #512 D - Vasya and Triangle

    D - Vasya and Triangle #include<bits/stdc++.h> using namespace std; #define LL long long LL gc ...

  7. 洛谷P3709 大爷的字符串

    题意:多次求区间众数的出现次数. 解: 这题居然可以莫队...... 首先开个桶.然后还要开个数组,cnt[i]表示出现i次的数有多少个. 然后就可以O(1)修改了. #include <cst ...

  8. django 通过ajax完成登录

    一. 在users/views.py中加代码: from django.http import HttpResponse class LoginView(View): ""&quo ...

  9. django基于存储在前端的token用户认证

    一.前提 首先是这个代码基于前后端分离的API,我们用了django的framework模块,帮助我们快速的编写restful规则的接口 前端token原理: 把(token=加密后的字符串,key= ...

  10. post请求中data参数的应用

    一.data为参数,json是自动的把参数转换成了json格式,一般建议用json ,url是请求地址. 二,以一个网站来做解释,看登陆的请求 抓包看一下: 用在代码里面看一下: 如果不转的话,那么用 ...