题解【C-Unique Values】

题目链接

题解链接

P1 题目描述

 

P2 新学知识

 

P3 用到的模板

 

P4 题目思路

 题意:计数问题,有多少个不含重复元素的连续子序列。
算法:双指针,STL。
思路:第一个指针用来统计答案,第二个指针用来保证子序列中不含重复元素。

对于每个位置,记录在它及其前面位置中出现重复元素的最大位置的下标(如该5位置value=12,上一个value=12的位置是3,cnt5 就是3),每个位置tot[i] = max(tot[i-1], cnt[i])表示以i位置结尾,最多能与什么位置开头的字串满足不重复,答案为ans += i-tot[i],因为在这两个位置中的任意字串都不会重复

整理:

对于i位置,从后往前,如果遇到一个数,它出现第二次则代表不必往前走了,以i结尾的字串再怎样都不行了,故标记每个位置的上一个出现该数的地方,从前往后,保持更新最大答案表示当前i位置往前遇到重复字符的位置,对于每个位置i,答案就是i-这个最大位置

P5 代码解析

#include<bits/stdc++.h>
#define LL long long
using namespace std;

map<LL,LL>ma;
const int maxn=1e5+10;
int main(){
    LL n,a[maxn];
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    LL res=0,j=0;
    for(int i=1;i<=n;i++){
        if(ma[a[i]]){
            j=max(ma[a[i]],j);
        }
        res+=i-j;
        ma[a[i]]=i;
    }
    cout<<res<<endl;

    return 0;
}
View Code

P6 奇怪的感悟们

 

over

posted @ 2021-07-21 11:19  bear_xin  阅读(29)  评论(0)    收藏  举报