题目描述: 给你一个数组,每个区间段的值等于该区间内不相等元素的个数,现在让你输出这个大区间所包含区间段的总值
1<=a[i],n<=1e5;(看数据也可以看出来要处理a[i]的值)
分析:比赛时自闭了4.30个小时,,,,, 这个题的思路是把它按每个元素的贡献来写的,首先从输的方向从左到右,该元素又可以看成是前一个的往后延伸了一位,那么多出来的贡献是那段没有该值的区间;
所以记录每个值最后出现的位置 这点的贡献等于前面一点的贡献+这点的位置-上次出现过的位置
ac代码:
#include<bits/stdc++.h> using namespace std; int vis[100004]={0}; int main(){ int n; cin>>n; int d=0,c=0; for(int i=1;i<=n;i++){ int x; cin>>x; d+=i-vis[x]; c+=d; vis[x]=i; cout<<c<<' '<<d<<' '<<i<<endl; } cout<<c<<endl; }