BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)
解题思路
刚开始想到了莫队+\(bitset\)去维护信息,结果发现空间不太够。。试了各种奇技淫巧都\(MLE\),最后\(\%\)了发题解发现似乎可以分段做。。这道题做法具体来说就是开\(3\)个\(bitset\),然后对原序列离散化之后给每个值规定一个开始的位置,之后就可以莫队搞,计算答案是用总的元素个数减去扔掉的,而扔掉的其实就是三个\(bitset\)做与运算后\(1\)的个数,时间复杂度\(O(n\sqrt n+\frac{n^2}{w})\)。\(bzoj\)上时限\(80s\)跑了\(80s\),荣获倒一。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
const int M=10000;
inline int rd(){
	int x=0,f=1; char ch=getchar();
	while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	return f?x:-x;
}
int n,m,a[N],cpy[N],pos[N],u,b[N],siz,num,slen[N];
int ll[N][4],rr[N][4];
struct Data{
	int l,r,id,type;
	friend bool operator<(const Data A,const Data B){
		if(A.l/siz!=B.l/siz) return A.l<B.l;
		if((A.l/siz)&1) return A.r>B.r;
		return A.r<B.r;
	}
	Data(int _l=0,int _r=0,int _id=0,int _type=0){
		l=_l; r=_r; id=_id; type=_type;
	}
}q[N*3];
bitset<N> f[3][10010],g;
#define Add(x) g.set(pos[a[(x)]]++)
#define Del(x) g.reset(--pos[a[(x)]])
void solve(int l,int r){
	int tot=0;
	for(int i=1;i<=n;i++)
		if(b[i]!=b[i-1]) pos[b[i]]=i;
	for(int i=l;i<=r;i++){
		q[++tot]=Data(ll[i][0],rr[i][0],i-l+1,0);
		q[++tot]=Data(ll[i][1],rr[i][1],i-l+1,1);
		q[++tot]=Data(ll[i][2],rr[i][2],i-l+1,2);
	}
	sort(q+1,q+1+tot);
	int L=1,R=0; g.reset();
	for(int i=1;i<=tot;i++){
		while(L>q[i].l) L--,Add(L);
		while(R<q[i].r) R++,Add(R);
		while(L<q[i].l) Del(L),L++;
		while(R>q[i].r) Del(R),R--;
		f[q[i].type][q[i].id]=g;
	}
	for(int i=1;i<=r-l+1;i++){
		printf("%d\n",(slen[i+l-1]-3*((f[0][i]&f[1][i]&f[2][i]).count())));
		f[0][i].reset(); f[1][i].reset(); f[2][i].reset();
	}
}
int main(){
	n=rd(),m=rd(); int l1,r1,l2,r2,l3,r3;
	for(int i=1;i<=n;i++) a[i]=cpy[i]=rd();
	sort(cpy+1,cpy+1+n); siz=sqrt(n);
	u=unique(cpy+1,cpy+1+n)-cpy-1;
	for(int i=1;i<=n;i++)
		a[i]=lower_bound(cpy+1,cpy+1+u,a[i])-cpy;
	memcpy(b,a,sizeof(b)); sort(b+1,b+1+n);
	for(int i=1;i<=m;i++){
		l1=rd(),r1=rd(),l2=rd(),r2=rd(),l3=rd(),r3=rd();
		ll[i][0]=l1,ll[i][1]=l2,ll[i][2]=l3;
		rr[i][0]=r1,rr[i][1]=r2,rr[i][2]=r3;
		slen[i]=r1-l1+1+r2-l2+1+r3-l3+1;
	}
	for(int i=1;i<=m;i+=M)
		solve(i,min(m,i+M-1));
	return 0;
}
BZOJ 4939: [Ynoi2016]掉进兔子洞(莫队+bitset)的更多相关文章
- BZOJ.4939.[Ynoi2016]掉进兔子洞(莫队 bitset 分组询问)
		BZOJ 洛谷 删掉的数即三个区间数的并,想到bitset:查多个区间的数,想到莫队. 考虑bitset的每一位如何对应每个数的不同出现次数.只要离散化后不去重,每次记录time就可以了. 但是如果对 ... 
- [Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset)
		[Luogu 4688] [Ynoi2016]掉进兔子洞 (莫队+bitset) 题面 一个长为 n 的序列 a.有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间 ... 
- BZOJ4939: [Ynoi2016]掉进兔子洞(莫队 bitset)
		题意 题目链接 一个长为 n 的序列 a. 有 m 个询问,每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的个数和,询问独立. 注意这里删掉指的是一个一个删,不是把等于 ... 
- BZOJ 4939 [Ynoi2016]掉进兔子洞(莫队+bitset)
		[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4939 [题目大意] 给出一个数列,每个询问给出三个区间,问除去三个区间共有的数字外, ... 
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
		题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ... 
- luogu P4688 [Ynoi2016]掉进兔子洞 bitset 莫队
		题目链接 luogu P4688 [Ynoi2016]掉进兔子洞 题解 莫队维护bitset区间交个数 代码 // luogu-judger-enable-o2 #include<cmath&g ... 
- 【洛谷 P4688】 [Ynoi2016]掉进兔子洞(bitset,莫队)
		题目链接 第一道Ynoi 显然每次询问的答案为三个区间的长度和减去公共数字个数*3. 如果是公共数字种数的话就能用莫队+bitset存每个区间的状态,然后3个区间按位与就行了. 但现在是个数,bits ... 
- 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 ... 
- BZOJ4939 Ynoi2016掉进兔子洞(莫队+bitset)
		容易发现要求三个区间各数出现次数的最小值.考虑bitset,不去重离散化后and一发就可以了.于是莫队求出每个区间的bitset.注意空间开不下,做多次即可.输出的东西错了都能调一年服了我了. #in ... 
随机推荐
- 【Linux开发】IO streaming DMA buffer importing
			http://linuxtv.org/downloads/v4l-dvb-apis/dmabuf.html I/O流 (DMA缓存引用) 这是一个实验性接口,将来可能发生改变 DMABUF框架提供了在 ... 
- 实验3&总结5
			老师:lijin2019,助教:晨晨果 提交作业 实验三 String类的应用 实验目的 掌握类String类的使用: 学会使用JDK帮助文档: 实验内容 1.已知字符串:"this is ... 
- keystone验证安装
			以管理员的身份来请求鉴权的标识 keystone --os-tenant-name admin --os-username admin --os-password 123456 --os-auth- ... 
- [BZOJ 3771] Triple(FFT+容斥原理+生成函数)
			[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ... 
- SQL性能优化概要
			基本概要 1.查询的模糊匹配时,避免使用Like '%开头',使得索引失效 2.索引问题 ◆ 避免对索引字段进行运算操作和使用函数 ◆ 避免在索引字段上使用not,<>,!= ◆ 避免在索 ... 
- es6中class类的全方面理解(一)
			传统的javascript中只有对象,没有类的概念.它是基于原型的面向对象语言.原型对象特点就是将自身的属性共享给新对象.这样的写法相对于其它传统面向对象语言来讲,很有一种独树一帜的感脚!非常容易让人 ... 
- ThinkPHP无法打开或点击不了Trace的问题
			首先先确认是否打开了Trace配置项,ThinkPHP3.*为'SHOW_PAGE_TRACE'=>true,ThinkPHP5.*为'app_trace'=>true. 如果已经确认开启 ... 
- 机器学习-KNN算法详解与实战
			最邻近规则分类(K-Nearest Neighbor)KNN算法 1.综述 1.1 Cover和Hart在1968年提出了最初的邻近算法 1.2 分类(classification)算法 1.3 输入 ... 
- oracle比较两个查询结果的差异
			可以使用minus select * from A minus select * from B; select * from B minus select * from A; 
- dockerfile制作笔记
			dockerfile语法格式: FROM: 基础镜像(就是在什么镜像上面做) MAINTAINER: 镜像创建者信息(作者的信息) EXPOSE: 开放的端口 ENV: 设置变量 ... 
