2019牛客暑期多校训练营(第八场)Beauty Values(思维


来源:

https://ac.nowcoder.com/acm/contest/888/B

题意:

求数组中所有子区间内不同元素的种类的和。

思路:

我们不难想到,对于每一个数字在每一个子区间最大贡献为1,当重复出现某一个元素时候,只需要从前面最近的一个相同的元素(位置为j)算起就行( j - i + 1) * (n - j + 1),故统计每个数的区间,可以由左右端点集合构成答案,遍历即可。

代码:

#include<bits/stdc++.h>

#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define N 100006

using namespace std;
int main() {
    int n;
    IOS;
    while (cin >> n) {
        vector<int> a[N];
        for (int i = 1; i <= n; ++i) {
            int t;
            cin >> t;
            a[t].push_back(i);
        }
        ll ans = 0;
        for (int i = 1; i <= 100000; ++i) {
            if (!a[i].size()) {
                continue;
            }
            ll sum = 0;
            for (auto j :a[i]) {
                ans += (j - sum) * (n - j + 1);
                sum = j;
            }
        }
        cout << ans << endl;
    }
    return 0;
}
优质内容筛选与推荐>>
1、Restful levels and Hateoas
2、文章详情与点赞和评论
3、Elasticsearch: Index template
4、centos7 卸载mysql
5、MySQL逻辑架构


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号