首页 > 其他分享 >24/11/30 ABC381+莫队+分块+整体二分学习笔记

24/11/30 ABC381+莫队+分块+整体二分学习笔记

时间:2024-11-30 11:10:43浏览次数:7  
标签:24 11 cnt 位置 ++ 30 个数 区间 二分

[ABC381D]

好题。
由于题目描述中提到了取出的子序列长度必须是偶数个,所以可以考虑对于原来的\(a\)序列每次进行长度为\(2\)的尺取,这时候不难发现对于开头位置具有两个答案,一个是从\(1\)为开头,一个是从\(2\)为开头,所以写个函数封装一下就好了,类似这种cout << max(solve(1),solve(2))

接下来考虑在尺取过程中如何计算答案的贡献,设当前枚举到的区间开头为\(l\),结尾是\(r\),每个数出现的次数是\(cnt_i\),拥有以下两种情况:

  • 第一种:\(a_r \ne a_{r+1}\)
    针对这种情况,显然是对于\(a_r\)和\(a_{r+1}\)这两个位置都不可取(Q:为什么不可以取\(a_{r+1}\)呢? A:若取了\(a_{r+1}\),那么后面答案计算出来的都是成对出现的,一定是偶数个,加上这个序列长度就会变成奇数个),既然这两个位置不可取,那么所有包含他俩的子序列都不可取,所以将\(l \to r\)这段区间所有的数都扔掉,即这段区间所有数的出现次数\(-1\),同时将\(r\)变成\(r+2\)(即下个尺取的地方),\(l = r\)。
if(a[r] != a[r+1])
{
	for(int i = l;i < r;i++) cnt[a[i]]--;
	r = r+2;
	l = r;
}
  • 第二种:\(a_{r} = a_{r+1}\)
    针对这种情况,我们对于\(l \to r\)这段区间还要满足第三个条件,也就是题目中说到的所有数出现次数不是\(0\)次,就是\(2\),直接从\(l\)开始,不断地将\(l + 2\)并同时减去\(a_l\)与\(a_{l+1}\)出现的次数,直到满足\(cnt_{a_r} = 2\),最后将\(r+2\),变动一下就好了。
else
{
	cnt[a[r]]++,cnt[a[r+1]]++;
	while(l < r && cnt[a[r]] > 2)
	{
		cnt[a[l]] -= 2;
		l += 2;
	}
	r += 2;
}

那么最后对于所有计算过程中算到的答案取一个\(\max\)即可。

[ABC381E]

好题。
如果将题面抽象一下的话,其实跟龙之研习差不多,比较有意思,如果做过这场ABC的C题的话,有可能会受到启发。

我们考虑将每一个/的位置用数组记录下来,针对每一个/所产生的答案,显然为(其左侧\(1\)的个数和其右侧\(2\)的个数)\(\times 2+1\),随着/位置的向右侧移动,显然发现\(1\)的个数在单调递增,\(2\)的个数在单调递减,可以考虑二分,二分方法如下:

用数组记录每个/的位置,二分出任意一个/,判断这个位置是否在查询的区间内,不在的话就移动\(l\)或\(r\);提前预处理出针对每一段区间\(1\)的个数和\(2\)的个数,显然可以用前缀和,\(O(1)\)计算当前/左侧\(1\)的个数和\(2\)的个数,贡献计算方式上面写了,对于单调性问题,我们显然是尽可能让右侧的\(1\)的数量增加,故当\(c_1 <= c_2\)时,l=mid+1

Submission

标签:24,11,cnt,位置,++,30,个数,区间,二分
From: https://www.cnblogs.com/grz0306/p/18578129

相关文章

  • VectorDraw 11.3.2 for .NET Crack
    VectorDrawRayTracingEngine(vdRay)isanadd-onlibrarytotheVectorDrawDevelopersFrameworkthatgivesyoutheabilitytoexportphoto-realisticimagesfromyourapplication.Easyandsimple,vdRaywillhelpyoucreateniceimagesandalsovideosfr......
  • EX_24/11/29
    作业一:展开的思路,按要求分析以下代码。要求不要放到编译器中运行,自己手动分析出每条输出语句的结果,分析出结果后,再在编译器中执行验证结果voidmain(){intnum,num2,num3;num=1;num2=2;num3=3;num=++num2+++num3;printf("\n%d,%d,%d",num,num2,num3);//输出结果1num......
  • Atcoder Beginner Contest 330 题解
    前言过于水的一场。ACountingPasses题面给出一个长度为\(n\)的序列\(a\),求出\(a\)之中大于等于\(l\)的数个个数。\(1\len\le100,1\lea_i\le1000,1\lel\le1000\)。制約入力は全て整数$1\\le\N\\le\100$$1\\le\L\\le\1000$$0\\le\A_i\\le......
  • 2024-2025-1 20241328 《计算机基础与程序设计》第十周学习总结
    2024-2025-120241328《计算机基础与程序设计》第十周学习总结作业信息作业课程2024-2025-1-计算机基础与程序设计作业要求2024-2025-1计算机基础与程序设计第一周作业作业目标信息系统,数据库与SQL,人工智能与专家系统,人工神经网络,模拟与离散事件,排队系统,天气与地......
  • 2024-11-30:质数的最大距离。用go语言,给定一个整数数组 nums,请找出两个(可以是相同的)质
    2024-11-30:质数的最大距离。用go语言,给定一个整数数组nums,请找出两个(可以是相同的)质数在该数组中的下标之间的最大距离。提示:nums的长度在[1,3*10^5]之间。nums的每个元素的值在[1,100]。输入保证nums中至少有一个质数。输入:nums=[4,2,9,5,3]。输出:3。解释:nums[1]......
  • 学习javascript基础这一篇就够了(2024最新版)
    目录前言什么是JavaScript?BOM-浏览器对象模型DOM-文档对象模型JavaScript与Java的关系JavaScript与ECMAScript的关系JavaScript能做什么?前端领域后端领域APP桌面应用图形/游戏嵌入式与IOT开发为什么要学JavaScript?学习JavaScript所需要的的环境与设备......
  • JSR303统一校验
    1、简介jsr是JavaSpecificationRequests的缩写,意思是java的请求规范。周志明老师的书上还着重介绍过jsr292(jvm多语言支持包括Kotlin,Clojure,JRuby,Scala等)。JSR303着重参数校验功能,点开javax.validation.constraints,可以看到已经封装好的注解有这些:使用jsr303规范......
  • 2024-2025-1 20241305 《计算机基础与程序设计》第十周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP))这个作业要求在哪里2024-2025-1计算机基础与程序设计第十周作业(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276))......
  • 利用结构体存储实体状态——2024TapTap聚光灯GameJam(二)
    利用结构体存储实体状态——2024TapTap聚光灯GameJam(二)记录日期 2024-11-29         项目时间 2024-10-8         历经时长 21 天简介策划要求实现游戏中角色可以扔出手中提灯,并保持扔出前的光线角度、颜色。(可惜最后功能完美实现,但是这个玩法被取......
  • 2024-2025-1 20241403 《计算机基础与程序设计》第十周学习总结
    学期2024-2025-1学号20241403《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机......