一道比较简单的莫队……

用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. 【bzoj1231】[Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp

    题目描述 混乱的奶牛[Don Piele, 2007]Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= ...

  2. python函数调用关系图(python call graph)

    由于要重构项目的部分代码,要整理好主要的函数调用关系,不想自己看代码慢慢画出结构,想找出一种通用的,节省人力的方法得出函数间的调用关系图,于是发现以下几个工具.(内网没装好graphviz,还没真正用 ...

  3. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  4. 【题解】CF#1012 C-Hill

    感觉这题的状态还是比较明显的.设置状态 \(f[i][j][0/1]\) 表示dp到第 \(i\) 个位置,前面(包括这里)已经出现了 \(j\) 个山峰,当前位置是不是山峰即可 dp.这样的状态有一 ...

  5. 【题解】51nod1967 路径定向

    第一次写欧拉回路,实际上只要dfs下去就可以了,反正每条边都是要遍历一遍的…… 关键有两个性质:1.一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图.2.一个有向图存在欧拉回路 ...

  6. 洛谷 P1966 火柴排队 解题报告

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 \(n\) 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: \(\s ...

  7. 放弃采用Mycat的条件

    Mycat::一个新颖的数据库中间件产品 设计使用Mycat时: 满足以下任意一条,请考虑放弃使用MyCat 有非分片字段查询 有分页排序 进行表JOIN操作,除非要确保两个表的关联字段具有相同的数据 ...

  8. 使用freemarker生成word、html时图片显示问题

    使用freemarker生成word.html时图片显示问题 博客分类: Java 使用freemarker生成word时图片显示问题使用freemarker生成html时图片显示问题使用iText生 ...

  9. c# 折半查找法实现代码

    ] { , , , , , , , , , , , , , , , , , , , }; , i; string j, k; , ); ) { k = String.Format("未找到{ ...

  10. ES6数组的扩展运算符

    一.基本使用 ES6中函数可以使用 rest参数 接收函数的多余参数,组成一个数组,放在形参的最后面. let fn = (a, ...value) => { console.log(a); c ...