题解【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; }
P6 奇怪的感悟们
over

浙公网安备 33010602011771号