2026牛客寒假算法基础集训营2 H题

权值计算

https://ac.nowcoder.com/acm/contest/120562/H

声明:本题解有参考验题人题解

题目描述


Algorithm 1 函数 f 用于计算数组 s 的权值
function f(l, r, s)
distinct ← ∅
total ← 0
current_count ← 0
for i ← l to r do
  if s[i] ∉ distinct then
current_count ← current_count + 1
distinct ← distinct ∪ {s[i]}
end if
total ← total + current_count
end for
return total
end function

如上是一段计算数组权值的伪代码,通过调用 f(1,m,s) 计算一个长度为 m 的数组 𝑠 1 , 𝑠 2 , … , 𝑠 𝑚 的权值,现在 Bingbong 有一个长度为 n 的数组 𝑎 1 , 𝑎 2 , … , 𝑎 𝑛 ,请你帮助他求出所有非空子数组的权值之和。

【名词解释】 子数组:从原数组中,连续的选择一段元素(可以全选、可以不选)得到的新数组。

输入描述:

每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤10 ^ 4 ),代表数据组数,每组测试数据描述如下:

第一行输入一个整数 𝑛 ( 1 ≤ 𝑛 ≤ 1 0 ^ 5 ) ,表示数组长度。 第二行输入 n 个整数 𝑎 1 , 𝑎 2 , … , 𝑎 𝑛 ( 1 ≤ 𝑎 𝑖 ≤ 1 0 ^ 9 ) ,表示数组中的元素。

除此之外,保证单个测试文件的 n 之和不超过 1 0 ^ 5 。

输出描述:

对于每一组测试数据,新起一行输出一个整数,表示所有子数组的权值之和。 伪代码大致意思是说计算下标l到l,l到l+1,l到l+2,......,l到r区间内每个区间数组s有多少个不同的数字,我们需要按顺序记录每个数字出现的各个位置,这里我们用mp[num][i]来表示第i(i>0)个表示数字num的数的位置, 以便后续计算,注意对于每一个数的位置中先插入一个0,方便计算,下面用示例1的一组数据举例:

3

1 3 1

这组数据的非空子数组有{1},{3},{1},{1,3},{3,1},{1,3,1},前三个无需多言贡献都为1,{1,3}的贡献为看第一个位置有一个不相同的数1,第二个位置有两个不相同的数1和3,故贡献为3,{3,1}看第一个位置有一个不相同的数3,第二个位置有两个不相同的数3和1,贡献同样为3,{1,3,1}第一个不相同的数1,第二个位置有两个不相同的数1和3,第三个位置有两个不相同的数1和3,贡献为5,相加得贡献为1+1+1+3+3+5=14. 我们不妨计算以每个数可以为总贡献贡献多少,让我们来看第二组样例:

6

1 1 4 5 1 4

拿第一个4对于总贡献的贡献举例,有{1,1,4},{1,1,4,5},{1,1,4,5,1}三个子数列中4的贡献(n-i+1)(n-i+2)/2,以及{1,4},{1,4,5},{1,4,5,1}的(n-i+1)(n-i+2)/2点贡献和{4},{4,5},{4,5,1}的(n-i+1)(n-i+2)/2点贡献,故第一个4的贡献可以视作(n-i+1)(n-i+2)/2*(mp[1][i+1]-mp[1][i]),mp[1][i+1]-mp[1][i]为同一个数字两位置的差值。 代码如下:

void solve()
{
	ll n,sum=0;
	cin>>n;
	map<ll,vector<ll>>mp;
	for(ll i=1;i<=n;i++)
	{
		ll num;
		cin>>num;
		if(mp.count(num)==0)
			mp[num].push_back(0);
		mp[num].push_back(i);
	}
	for(auto &[key,val]:mp)
	{
		for(ll i=0;i<(ll)val.size()-1;i++)
		{
			ll l=n-val[i+1]+1;
			sum+=l*(l+1)/2*(val[i+1]-val[i]);
		}
	}
	cout<<sum<<endl;
}

如有错误,烦请指正谢谢

全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务