zoukankan      html  css  js  c++  java
  • 牛客多校第八场 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
    ",t);
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    新浪微博采用Oauth发送图片和文字
    android proguard也有弱点
    POJ 2376
    POJ 3259
    POJ 2253
    POJ 1062
    POJ 2299
    POJ 2186
    POJ 1860
    POJ 2823
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11348457.html
Copyright © 2011-2022 走看看