首页 > 其他分享 >模拟赛总结

模拟赛总结

时间:2024-02-17 12:34:42浏览次数:32  
标签:总结 gcd 序列 珠子 leqslant 区间 操作 模拟

2024.2.6

T1 珠子

小 F 有 $n $颗珠子排成一个序列,每个珠子有一个颜色,颜色共有 $m $种,编号为 $1,2,…,m $。她想取出一段连续的珠子,对于每一种颜色 $i $,要求取出的珠子个数在 \([l_i,r_i] ( 0 \leqslant l_i \leqslant r_i \leqslant n)\)之间。求有多少种取珠子的方案。

暴力:前缀和处理前\(i\)位第\(j\)类珠子的总数,用\(n^2\)枚举\(l,r\)

期望:\(60pts\)

没用前缀和:\(30pts\)

正解:双指针

先固定左端点,然后分别去找满足颜色要求的最小\(r_1\)(一般是满足下限)和最大\(r_2\)(一般是达到上限),由于\(r_1 \sim r_2\)各颜色数目显然单调不减,所以一对\((r_1,r_2)\)对答案的贡献就是\(r2 - r1 + 1\)

至于怎么较快的找到\(r_1,r_2\),不会先咕咕

T2 数组

初始\(a_i = i\),现有两种操作

  • \(A\):已知\(p,q\),修改所有数,\(a_i = p \times i + q\)

  • \(B\):已知\(x,y\),将\(a_x\)改为\(y\)

给出若干操作,在每次操作后输出数组元素和

第一个好办,看第二种

第二种的麻烦点在于上一次\(x\)位置的\(B\)操作可能会被\(A\)覆盖掉,所以要记录上一次\(A\)操作的时候\(num\),以及\(x\)处的上一次\(B\)操作的时候\(tag\)

如果\(tag \leqslant num\),说明上一次的\(B\)操作已经被覆盖掉了,那么就减去上次\(A\)操作改的值,加上\(y\)

否则减去上次\(B\)操作改成的值\(y'\),加上\(y\)

for(int i = 1;i <= m;i++)
{
	cin >> op;
	if(op == 'A')
	{
		cin >> t[i].p >> t[i].q;
		cnt = i;//记录最新A操作的时候
		sumq = 0;//覆盖掉
		cout << (ll)t[i].p * sum + t[i].q * n << '\n';
	}
	if(op == 'B')
	{
		cin >> t[i].p >> t[i].q;
		if(tag[t[i].p] <= cnt)//上次该处的B已被覆盖
		{
			sumq = sumq + (ll)t[i].q - (ll)(t[cnt].p * t[i].p + t[cnt].q);// 减去A操作留下的值(p*i+q),加上y
			tag[t[i].p] = i;
		}
		else
		{
			int y = tag[t[i].p];
			sumq = sumq + t[i].q - t[y].q;//减去上次B操作留下的值
			tag[t[i].p] = i;
		}
		cout << (ll)t[cnt].p * sum + n * t[cnt].q + sumq << '\n';
	}
}

蒟蒻没有考虑到\(A\)操作会覆盖\(B\),只得了一半分,gg

T3 幸运区间

已知\(\{a_i\}\),定义幸运区间为区间内所有数的\(\gcd = 1\),求幸运区间数

暴力:分解质因数,拿质因子搞

\(20pts\)(主要是数组开不了那么多)

正解:双指针(byd)

考虑一个显然的结论:若一个序列存在一个子序列,其所有数的\(\gcd = 1\),那么这整个序列的数的\(\gcd = 1\)

那么,每次固定左端点,找到最小的\(r\),满足\([l,r]\)中元素\(\gcd = 1\),那么根据结论:\([l,r],[l,r + 1],[l,r + 2] \cdots [l,n]\)均为幸运区间,也就是说一个\(r\)对答案的贡献\(ans += n - r + 1\)

至于找到最小的\(r\),可以使用一些数据结构来维护

还有一点:有结论我们还可推得:一个序列的\(\gcd = 1\),这个序列的子序列的\(\gcd\)一定\(\geqslant1\),所以找到\(r\)后,我们可以固定\(r\),跳\(l\),这样就可以省时间了

int l=1,r=1;
for(l=1;l<=n;l++)
{
	r=max(l,r);//双指针思想,性质保证了可以固定r跳l,这样就是O(n)
	while(l<=r&&r<=n)
	{
		if(st.getgcd(l,r,1,n,1)==1) break;//此处使用线段树,由结论可知gcd有传递性
		r++;
	}
	ans+=n-r+1;
}

T4 找不同

已知一串单词,给定若干区间,判断每个区间中是否有重复单词

先Hash,此处使用map开的mp和last

类比HH的项链,不同单词即不同颜色,那么没有重复就是区间内颜色种类等于区间长度

蒟蒻没想到类比,打的暴力,又gg了,只能说树状数组那章是划水过来的

for(int i = 1;i <= q;i++)
{
	int l1 = b[i].l;
	int r1 = b[i].r;
	while(pos <= r1)
	{
		add(pos,1);
		if(last[mp[pos]] == 0) last[mp[pos]] = pos;//记录上一次出现位置
		else
		{
			if(last[mp[pos]] < pos)//上一次出现位置在区间内
			{
				add(last[mp[pos]],-1);//把原来加的1减掉
				last[mp[pos]] = pos;//更新
			}
		 } 
		 pos++;
	}
	ans[b[i].id].val = sum(r1) - sum(l1 - 1);
	ans[b[i].id].l = l1;
	ans[b[i].id].r = r1;
}

两道双指针题给蒟蒻的第一感觉就是:\(l,r\)只会往一个方向走,不会反向跳到某一位置

标签:总结,gcd,序列,珠子,leqslant,区间,操作,模拟
From: https://www.cnblogs.com/MLP123/p/18017875

相关文章

  • 机器学习中7种常用的线性降维技术总结
    上篇文章中我们主要总结了非线性的降维技术,本文我们来总结一下常见的线性降维技术。1、PrincipalComponentAnalysis(PCA)PrincipalComponentAnalysis(PCA)是一种常用的降维技术,用于将高维数据集转换为低维表示,同时保留数据集的主要特征。PCA的目标是通过找到数据中最大......
  • 2月8日总结
    说,每个程序员但凡有过一段时间的编程之旅,多多少少会积累几个适合自己的,能帮助自己提高编程效率的编程习惯。在这里呢,陶朱公结合自己超10年编程方面积累的经验,深度总结了如下三个是我自己多年一直在用,并且对我帮助巨大的编程习惯,在此忍不住分享给大家,希望对大家有所帮助与启发。......
  • 2月7日总结
    在面试时,经常会被问一个问题:如何防止别人恶意刷接口?这是一个非常有意思的问题,防范措施挺多的。今天这篇文章专门跟大家一起聊聊,希望对你会有所帮助。1防火墙防火墙是网络安全中最基本的安全设备之一,主要用于防止未经授权的网络访问和攻击。防火墙可以防止的攻击行为包括:无效......
  • 2月11日总结
    个提问:你的编程能力从什么时候开始突飞猛进的?↓↓↓今天,我们就这个话题一起来做个讨论。我的回答话说这个话题着实有点泛、难以回答,这里简单跟大家分享一下我对于这个问题的一些看法,希望大家喜欢。我的观点认为,一个程序员但凡编程能力突飞猛进之后,会在如下6个能力方面有所体......
  • 2月10日总结
    三章:分层架构传统的IT团队结构按照技术领域进行组织,例如演示团队、后端开发团队和数据库团队等。由于大多数架构师、设计师和开发人员对这种结构非常熟悉,分层架构成为大多数商业应用程序开发项目的自然选择。然而,就像所有架构风格一样,它具有优点和缺点,并不适用于所有系统。描述......
  • 2月9日总结
    C#实现刘谦春晚魔术internalclassProgram{staticList<string>list=newList<string>(){"A","B","C","D","A","B","C","D"};staticstringhiddenEle1=string.Emp......
  • 2月13日总结
    四)---大鱼吃小鱼(互吃升级)鸿蒙开发游戏(五)---大鱼吃小鱼(添加音效)鸿蒙开发游戏(六)---大鱼吃小鱼(称霸海洋)前两篇文章我们做了摇杆控制小鱼移动,这篇将会添加一个NPC,让其自动在海洋里游荡,然后玩家控制吃掉它。在这之前我们想思考一些问题,NPC如何生成?NPC有哪些属性?NPC是如何控制的?如何......
  • 2月12日总结
    文|JamesMontemagno翻译|郑子铭VisualStudio2022在2023年发布了许多令人难以置信的功能,为.NET开发人员提供了大量新工具来提高他们的工作效率。有这么多可供选择,我精心挑选了一个包括编辑器改进、生产力更新和人工智能辅助的选项。让我们来探讨一些最有影响力的功能......
  • 2月16日总结
    exColor作为示例,可能过于简单这里再补充一个ini解析的示例由于实在写不动用其他库解析ini了,春节都要过完了,累了,写不动了,所以随意找了一份解析ini的库,仅供参考,对比不准确,毕竟完整库包含了更多功能先看看结果BenchmarkDotNetv0.13.12,Windows11(10.0.22631.3085/23......
  • 2月15日总结
    问题前,不妨先问大家几个问题:为什么我们需要操作系统?操作系统的出现解决了什么问题?为什么我们的电脑软件需要运行在诸如Win、Linux、MacOS等操作系统之上?我一直主张在学一门技术之前,最好提前能搞清楚诸如这些what、why、how的东西,这比一味埋头扎进知识库去硬着头皮学某知识点,更重......