牛客多校第八场 B Beauty Values 水题

题意:

给定一个序列,问你子区间中不同数字数量,在所有子区间中之和为多少。

题解:

统计每个数字在多少个区间中出现即可。对于每个数字,直接枚举左右端点。

注意去重,因此要记录每个数字上一次出现在哪里,在下一次出现时,从该数字上一次出现为止之后开始枚举左端点。

#include<iostream>
#include<vector>
#define MAXN 100005
#define LL long long
using namespace std;
vector<int> last[MAXN];
LL ans;
int main(){
    int n;
    scanf("%d",&n);
    ans=0;
    for(int i=1;i<=n;i++){
        int tmp;
        scanf("%d",&tmp);
        int l,r;
        if(last[tmp].empty()){
            l=1;r=n;
        }else{
            l=last[tmp].back()+1;r=n;
        }
        last[tmp].push_back(i);
        LL t;
        if(i==l)t=r-l+1;
        else if(l==r)t=1;
        else t=1LL*(r-i+1)*(i-l+1);
        ans+=t;
//      printf("%lld\n",t);
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/isakovsky/p/11348457.html