一道比较简单的莫队……

用bitset维护三个区间的交元素。

#include<bits/stdc++.h>
const int N=;
const int wy=;
#define UI unsigned int
#define rep(i,_x,_y) for (register int i=(_x);i<=(_y);i++)
#define rdp(i,_x,_y) for (register int i=(_x);i>=(_y);i--)
#define debug(x) cerr<<#x<<" = "<<x<<endl;
#define sqr(x) (x)*(x)
using namespace std;
int n,m,len,qaq,size,l1[N],r1[N],l2[N],r2[N],l3[N],r3[N],cal[(<<)+],A[N],b[N];
int block[N],pos[N],head[N],h[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
struct Data{
int x;int v;
bool operator <(const Data &f)const{return x<f.x;}
}a[N];
struct bs{
UI S[];
inline void update(int x){S[x>>]^=(1U<<(x&));}
inline int count(){int tot=;
rep(i,,) tot+=cal[S[i]>>]+cal[S[i]&];
return tot;
}
void clear(){memset(S,,sizeof(S));}
}now,c[];
inline bs operator ^ (bs &x,bs &y){
bs z;rep(i,,) z.S[i]=x.S[i]^y.S[i];
return z;
}
inline bs operator & (bs &x,bs &y){
bs z;rep(i,,) z.S[i]=x.S[i]&y.S[i];
return z;
}
struct Node{
int l,r,id;
Node(int l=,int r=,int id=):l(l),r(r),id(id){}
bool operator<(const Node &tmp)const{return block[l]==block[tmp.l]?(block[l]&)?r>tmp.r:r<tmp.r:l<tmp.l;}
}q[N];
inline void add(int x){h[x]++;now.update(head[x]+h[x]-);}
inline void del(int x){now.update(head[x]+h[x]-);h[x]--;}
inline void solve(){
now.clear();memset(h,,sizeof(h));memset(c,,sizeof(c));
int l=,r=;
sort(q+,q+len+);
for(int i=;i<=len;i++){
int lx=q[i].l,rx=q[i].r,id=q[i].id;
while(lx<l)add(A[--l]);
while(lx>l)del(A[l++]);
while(rx<r)del(A[r--]);
while(rx>r)add(A[++r]);
c[id]=c[id]&now;
}
}
int main(){
//freopen("xp1.in","r",stdin);
//freopen("xwd.out","w",stdout);
n=read();m=read();size=(int)sqrt(n+.);
rep(i,,(<<)-) cal[i]=cal[i>>]+(i&);
for(int i=;i<=n;i++)block[i]=(i-)/size+;
for(int i=;i<=n;i++)a[i].x=read(),a[i].v=i;
sort(a+,a+n+);
for(int i=;i<=n;i++)A[a[i].v]=a[i].x==a[i-].x?A[a[i-].v]:++qaq;
for(int i=;i<=n;i++)b[i]=A[i];
sort(b+,b+n+);
for(int i=;i<=n;i++)if(b[i]!=b[i-])head[b[i]]=i;
for(int i=;i<=m;i++){
l1[i]=read();r1[i]=read();l2[i]=read();r2[i]=read();l3[i]=read();r3[i]=read();
pos[i]=r1[i]+r2[i]+r3[i]-l1[i]-l2[i]-l3[i]+;
}
for(int i=;i<=m;i+=wy){
len=;
for(int j=i;j<=i+wy-;j++){
if(j>m)break;
q[++len]=Node{l1[j],r1[j],j-i+};
q[++len]=Node{l2[j],r2[j],j-i+};
q[++len]=Node{l3[j],r3[j],j-i+};
}
solve();
for(int j=i;j<=i+wy-;j++){
if(j>m)break;
printf("%d\n",pos[j]-*c[j-i+].count());
}
}
}

【LOJ6201】【bzoj4939】【YNOI2016】掉进兔子洞的更多相关文章

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

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

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

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

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

  4. bzoj4939: [Ynoi2016]掉进兔子洞

    将权值排序,设权值x排序后在[l,r]出现,x在区间中出现k次,则用[l,l+k-1]为1,[l+k,r]为0来表示x的出现次数 用bitset表示可重集中每个元素的出现次数,用莫队处理出询问区间对应 ...

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

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

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

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

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

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

  8. p4688 [Ynoi2016]掉进兔子洞

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

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

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

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

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

随机推荐

  1. sql批量更新关系型数据库

    更改gb_groupd里的chargingrulesname的值UPDATE   tb_group SET tb_group.chargingrulesname =tb_chargingrules.c ...

  2. [洛谷P5075][JSOI2012]分零食

    题目大意:有$m(m\leqslant10^8)$个人站成一排,有$n(n\leqslant10^4)$个糖果,若第$i$个人没有糖果,那么第$i+1$个人也没有糖果.一个人有$x$个糖果会获得快乐值 ...

  3. harbor1.4.0高可用部署

    一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数成为 Children 的方法,然 ...

  4. AOJ 7.Redraiment猜想

    Redraiment猜想 Description redraiment在家极度无聊,于是找了张纸开始统计素数的个数. 设函数f(n)返回从1->n之间素数的个数. redraiment发现: f ...

  5. Install JDK In Ubuntu

    安装Linux软件包管理器rpm apt install rpm 查看已安装的软件,如JDK rpm -qa|grep jdk #查询所有 找jdk 卸载已安装的软件 rpm -e nodeps 包名 ...

  6. @RequestParam 注解的使用

    @RequestParam 注解的使用 前言 在SpringMvc后台进行获取数据,一般是两种. 1.request.getParameter(“参数名”) 2.用@RequestParam注解获取 ...

  7. stout代码分支之十二:巧妙的EXIT

    在c++中,为了便于定位问题,进程异常退出时,需要获取返回码和错误信息.stout中将这种功能巧妙的封装成EXIT类. #define EXIT(status) __Exit(status).stre ...

  8. git--------------bug修复流程

    当前所有分支: master:主分支 test:测试分支 zs:开发人员分支 ls:开发人员分支 场景:zs正在开发A模块功能,线上环境产生了一个bug. zs的操作流程(当前分支为zs分支): 1. ...

  9. oracle 国外网站【转载】

    [转自]:http://www.2cto.com/database/201406/306615.html 1. http://www.oratechinfo.co.uk/ http://www.ora ...

  10. a标签nest问题,即a标签里面嵌套a标签

    方法一:使用div模拟a,监听click事件 方法二:使用<object>标签包裹内部a标签 <div style="width: 200px;height: 200px; ...