题解 | #权值计算#

权值计算

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

根据题目伪代码的意思,就是要求l和r上的前缀中不同元素个数的累加和,暴力的话会超时,所以在遍历的时候记录每个元素出现的位置,对于一个第一次出现的元素,对整个答案的贡献就为项数为n-该位置+1的等差数列的和,所以每个元素对答案的贡献就是该位置减去该元素第一个出现的位置和那个等差数列的乘积
#include <bits/stdc++.h>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        map<int,int> mp;
        long long ans=0;
        for(int i=1;i<=n;i++){
            int m;
            cin>>m;
            int c=i-mp[m];
            long long s1=n+1-i;
            long long s2=n+2-i;
            ans+=c*s1*s2/2;
            mp[m]=i;
        }
        cout<<ans<<endl;
    }
}

全部评论

相关推荐

02-16 01:39
南昌大学 Java
重剑Ds:感觉不太可能 后端都减飞了 根本不缺人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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