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],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)的更多相关文章
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ...
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ...
- BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
传送门 解题思路 刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够..试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做..这道题做法具体来说就是开\(3 ...
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ...
- BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)
容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...
- bzoj千题计划321:bzoj5251: [2018多省省队联测]劈配(网络流 + 二分)
https://www.lydsy.com/JudgeOnline/problem.php?id=5251 第一问: 左边一列点代表学生,右边一列点代表导师 导师向汇点连流量为 人数限制的 边 然后从 ...
- bzoj千题计划307:bzoj5248: [2018多省省队联测]一双木棋
https://www.lydsy.com/JudgeOnline/problem.php?id=5248 先手希望先手得分减后手得分最大,后手希望先手得分减后手得分最小 棋盘的局面一定是阶梯状,且从 ...
随机推荐
- 【cf842C】 Ilya And The Tree(dfs、枚举因子)
C. Ilya And The Tree 题意 给一棵树求每个点到根的路上允许修改一个为0,gcd的最大值. 题解 g是从根到当前点允许修改的最大gcd,gs为不修改的最大gcd.枚举当前点的因子,更 ...
- maven手动安装jar包到本地仓库,以ojdbc6为例
在做mybatis generator的中文注释实现时,感觉每次都要在配置文件中指定ojdbc6的位置太麻烦了,别人用也不方便,没有的还得自己去下,所以就想直接把ojdbc6打包到项目里,这样拿到就可 ...
- mysql安转过程中出现的问题! Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exis
net start mysql启动失败,报错信息如上,因缺少mysql这个库 所以跳过 在my.ini中添加 --skip-grant-tables 再启动mysql 然后进入mysql 倒入一个从其 ...
- Tarjan求有向图强连通详解
Tarjan求有向图强连通详解 注*该文章为转发,原文出处已经不得而知 :first-child { margin-top: 0; } blockquote > :last-child { ma ...
- 「SCOI2014」方伯伯的玉米田 解题报告
#2211. 「SCOI2014」方伯伯的玉米田 发现是取一个最长不下降子序列 我们一定可以把一个区间加的右端点放在取出的子序列的最右边,然后就可以dp了 \(dp_{i,j}\)代表前\(i\)个玉 ...
- 解题:CF622F The Sum of the k-th Powers
题面 TJOI2018出CF原题弱化版是不是有点太过分了?对,就是 TJOI2018 教科书般的亵渎 然而我这个问题只会那个题的范围的m^3做法 回忆一下1到n求和是二次的,平方求和公式是三次的,立方 ...
- 洛谷P3709 大爷的字符串
题意:多次求区间众数的出现次数. 解: 这题居然可以莫队...... 首先开个桶.然后还要开个数组,cnt[i]表示出现i次的数有多少个. 然后就可以O(1)修改了. #include <cst ...
- 洛谷P4175 网络管理
题意:链上带修第k大. 这毒瘤题...别看题意只有7个字,能把我吊打死... 介绍其中两种做法好了.其实思想上是一样的. 对于每一个点,建立权值线段树,维护它到根路径上的所有权值. 一条路径上的点集就 ...
- Spring boot学习笔记之@SpringBootApplication注解
@SpringBootApplication(exclude = SessionAutoConfiguration.class) public class BootReactApplication { ...
- webpack 非严格模式设置 npm i babel-plugin-transform-remove-strict-mode
安装插件:npm i babel-plugin-transform-remove-strict-mode 在.babelrc文件的插件项添加:"transform-remove-strict ...