zoukankan      html  css  js  c++  java
  • 2019牛客多校B Beauty Values——思维题

    题目

    求所有子区间中不同元素之和。

    分析

    枚举相邻的相同数字形成的区间,计算它是哪些区间的子区间,每次有-1的贡献,将其从总贡献中减去。

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const int maxn = 100000 + 10;
    int n;
    vector<int>a[maxn];
    int limit;   //出现过的最大值
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 1;i <= n;i++)
        {
            int tmp;
            scanf("%d", &tmp);
            a[tmp].push_back(i);
            if(tmp > limit)  limit = tmp;
        }
        ll ans = 0;
        for(int i = 1;i <= n;i++)  ans += 1LL * (n + 1 - i) * i;  //总贡献
    
        for(int i = 1;i <= limit;i++)
        {
            int pre = a[i][0];
            for(int j = 1;j < a[i].size();j++)
            {
                if(pre == 1)  ans -= (n - a[i][j] + 1);
                else if(a[i][j] == n)  ans -= pre;
                else  ans -= (1LL * pre * (n - a[i][j] + 1));
                pre = a[i][j];
    
            }
        }
        printf("%lld
    ", ans);
        return 0;
    }

     这里遍历了两遍,队友写的只遍历一遍,更加简短。https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41082850

  • 相关阅读:
    记坑
    常用模板
    ACM-东北赛划水记
    jzoj 4178游戏
    JZOI 4163
    jzoj 4146踩气球
    jzoj 5589. 缩点
    jzoj 5588 %%%
    jzoj 5571 ffs
    BJOI 2017 Kakuro
  • 原文地址:https://www.cnblogs.com/lfri/p/11333107.html
Copyright © 2011-2022 走看看