首页 > 其他分享 >bitset 优化莫队

bitset 优化莫队

时间:2023-09-05 21:50:28浏览次数:62  
标签:颜色 tong int 莫队 -- bitset 优化 wz

题目传送门:Ynoi跳进兔子洞

好题!

我们观察题目,发现题目让我们求的可以写成:

\[(r_1-l_1+1)+(r_2-l_2+1)+(r_3-l_3+1)-3\times size \]

其中:\(size\) 是三段中公共颜色的个数

问题转移成求三段公共颜色的个数。

考虑使用莫队,然后在转换左右边界的时候使用数组记录每个颜色出现几次,然后再求三个区间中每个颜色的最小值即可。

这显然是正确的,只是\(...\),优化吧

考虑只用一个变量记录出所有颜色分别出现几次,普通数组肯定是不行的,所以要用 \(bitset\)。

但是问题来了,\(bitset\) 只能记录每个颜色是否出现,不能记录每个颜色出现几次

这个时候就不能转化了,因为无法转化,所以我们考虑运用人类智慧去使 \(bitset\) 可以做到。

我们发现转化左右边界的时候可以得到出这个颜色是第几次出现,那么我们再在离散化时做一下手脚,记录一下比这个颜色小的颜色有多少个,那么在增量时令位置 \(mn_i+co_i\) 变成一,其中 \(co_i\) 是 \(i\) 颜色出现次数,\(mn_i\) 是比 \(i\) 小的颜色个数,显然这个位置是空的,最后再令在三段取交集,就是每个颜色的最小出现次数(理解一下)。

减去的时候也是同理。

这个时候就可以将六个量变成三组,每组两个量 \((l_i,r_i)\),分开求,大大降低时间复杂度

这个时候我们发现空间复杂度不够,用时间换空间,求三次就好了。

看代码吧:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+500;
int n,m,peo;
struct jgt
{
	int zhi,id;
}sr[N];
bool cmp(jgt t1,jgt t2)
{
	return t1.zhi<t2.zhi;
}
int a[N],b[N],sq,cnt,st[N];
struct jgt1
{
	int l,r,id;
}q[N];
bool cmp1(jgt1 t1,jgt1 t2)
{
	return (b[t1.l]^b[t2.l])?b[t1.l]<b[t2.l]:((b[t1.l]&1)?t1.r<t2.r:t1.r>t2.r);
//	return (b[t1.l]^b[t2.l])?b[t1.l]<b[t2.l]:t1.r<t2.r;
}
int idx,la;
bitset<N> ans[35000],now;
int ans1[N],tong[N];
void add(int wz)
{
	now.set(tong[a[wz]]+st[a[wz]],1);
	tong[a[wz]]++;
}
void del(int wz)
{
	tong[a[wz]]--;
	now.set(tong[a[wz]]+st[a[wz]],0);
}
void slove()
{
	sort(q+1,q+idx+1,cmp1);
	for(int i=1;i<=idx/3;i++) ans[i].set();
	int le=1,ri=0;
	now.reset();
	for(int i=1;i<=idx;i++)
	{
		while(ri<q[i].r) add(++ri);
		while(le>q[i].l) add(--le);
		while(ri>q[i].r) del(ri--);
		while(le<q[i].l) del(le++);
		ans[q[i].id-la]=(ans[q[i].id-la]&now);
	}
	for(int i=1;i<=idx;i++)
	ans1[q[i].id]-=ans[q[i].id-la].count();
	la=la+idx/3;
	while(ri>=le) del(ri--);
	idx=0;
}
int main()
{
	scanf("%d %d",&n,&m);
	sq=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&sr[i].zhi);
		sr[i].id=i;
		b[i]=(i-1)/sq+1;
	}
	sort(sr+1,sr+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		if(sr[i].zhi!=sr[i-1].zhi)
		{
			cnt++;
			st[cnt]=i;
		}
		a[sr[i].id]=cnt;
	}
	for(int i=1;i<=m;i++)
	{
		idx++;
		scanf("%d %d",&q[idx].l,&q[idx].r);
		q[idx].id=i;
		ans1[i]=ans1[i]+q[idx].r-q[idx].l+1;
		idx++;
		scanf("%d %d",&q[idx].l,&q[idx].r);
		q[idx].id=i;
		ans1[i]=ans1[i]+q[idx].r-q[idx].l+1;
		idx++;
		scanf("%d %d",&q[idx].l,&q[idx].r);
		q[idx].id=i;
		ans1[i]=ans1[i]+q[idx].r-q[idx].l+1;
		if(idx>=1e5) slove();
	}
	if(idx!=0) slove();
	for(int i=1;i<=m;i++)
	printf("%d\n",ans1[i]);
	return 0;
}

记得清空数组!!!

bitset不是所有运算都是 O(1) 的,只有 set(w,k) 是 O(1) ,其他都是 n/32

标签:颜色,tong,int,莫队,--,bitset,优化,wz
From: https://www.cnblogs.com/pengchujie/p/17680887.html

相关文章

  • 谷歌优化之地址更改工具
    地址更改工具将您的网站从一个网域迁移到另一个网域。关于此工具当您将网站从一个网域或子网域迁移到另一个网域或子网域时,可使用地址更改工具:例如,从example.com迁移到example.org或example2.com。此工具会告知Google您的更改,并帮助您在Google搜索结果中体现从旧网站到新......
  • 优化Docker权限管理:配置Docker用户组
    Docker利用Linux的用户和组权限来管理对Docker守护进程的访问权限。一般情况下,只有root用户和属于docker用户组的用户才被允许访问Docker守护进程。在Linux系统上使用Docker时,如果您尚未配置docker用户组,那么作为非root用户执行Docker相关命令将要求使用sudo......
  • MySQL分页查询详解:优化大数据集的LIMIT和OFFSET
    最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但每个工单都包含了大量的信息。DBA进行了多次导出操作,不幸的是,每次尝试导出都导致......
  • 掌握 MyBatis<choose>标签:优化动态查询条件的利器
    当谈到在Java应用程序中进行数据库访问时,MyBatis是一个备受欢迎的持久层框架。它的强大之处在于提供了灵活性和可定制性,使得数据库操作变得更加简便。在这篇文章中,我们将深入介绍MyBatis中的<choose>标签,它是一个有趣且功能强大的元素,用于在SQL映射文件中进行条件选择。MyBat......
  • explain | 索引优化
    前言对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。如果是高并发的场景,可能会出现数据库连接被占满的情况,直接导致服务不可用。慢查询的确会导致很多问题,我们要如何优化慢查询呢?主要解决......
  • 服务器性能指什么如何优化
    服务器性能指什么如何优化性能最通俗的衡量指标就是“时间”,CPU的使用率指的是CPU用于计算的时间占比,磁盘使用率指的是磁盘操作的时间占比。当CPU使用率100%时,意味着有部分请求来不及计算,响应时间增加或者超时;当磁盘使用率100%时,意味着有部分请求需要等待IO操作,响应时间也会增加或......
  • O2OA(翱途)平台新版本流程平台新增退回功能、新增关联文档功能、新增业务数据变更记录
    尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们,平台V8.1版本已正式发布。此次,为了更好的服务于业务场景,我们根据在项目中遇到的一些实际问题,重点也对流程平台和流程引擎做了细节上的优化,本篇将重点介绍流程平台中优化的一些细节,大家一起来看看。 ​ O2OA(翱途......
  • 一键播放功能LiteCVR视频汇聚平台视频调阅模块优化新增可选指定设备播放
    在LiteCVR项目现场中,使用者经常使用视频调阅左侧分组栏的一键播放功能来快速查看指定设备的视频。然而,最近他们发现当他们点击一键播放时,播放的视频并不是他们所期望的指定设备。为了解决这个问题,我们进行了详尽的排查。我们首先检查了代码,并发现了一个错误的判断条件。原来,当使用......
  • MySQL联表查询优化
    Linux系统-部署-运维系列导航  sql执行顺序执行FROM语句执行ON过滤join添加外部行执行where条件过滤执行groupby以及分组语句,(开始使用select中的别名,后面的语句中都可以使用别名)执行havingselect列表执行distinct去重复数据执行orderby字句执行limit字句 ......
  • 正则的匹配原理以及优化原则
    正则之所以能够处理复杂文本,就是因为采用了有穷状态自动机(finiteautomaton)。那什么是有穷自动机呢?有穷状态是指一个系统具有有穷个状态,不同的状态代表不同的意义。自动机是指系统可以根据相应的条件,在不同的状态下进行转移。从一个初始状态,根据对应的操作(比如录入的字符集)执行状态......