寒假算法基础集训营2 H题题解

比赛安排(PDF题面存放于本题)

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

由伪代码可知某个数的贡献会受它前一次出现的位置影响,当子数组包含上一次出现的这个数时,此时该位置该数不算贡献,所以要开个last映射它上一次的位置,计算以当前位置结尾的所有子数组中当前位置的贡献时减去last即可。

附本人ac码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define mod 998244353
const ll N=1e6+10;
ll a[N],pre[N],cnt[N]; 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
    int t;
	cin>>t;
	while(t--)
	{
		map<int,int>last;
		ll n;
		cin>>n; 
		ll sum=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			cnt[i]=cnt[i-1]+i-last[a[i]];
			last[a[i]]=i;
			pre[i]=pre[i-1]+cnt[i];
			sum+=pre[i];
		}
		cout<<sum<<endl;
	}
	return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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