牛客多校第八场 B Beauty Values 水题
题意:
给定一个序列,问你子区间中不同数字数量,在所有子区间中之和为多少。
题解:
统计每个数字在多少个区间中出现即可。对于每个数字,直接枚举左右端点。
注意去重,因此要记录每个数字上一次出现在哪里,在下一次出现时,从该数字上一次出现为止之后开始枚举左端点。
#include<iostream> #include<vector> #define MAXN 100005 #define LL long long using namespace std; vector<int> last[MAXN]; LL ans; int main(){ int n; scanf("%d",&n); ans=0; for(int i=1;i<=n;i++){ int tmp; scanf("%d",&tmp); int l,r; if(last[tmp].empty()){ l=1;r=n; }else{ l=last[tmp].back()+1;r=n; } last[tmp].push_back(i); LL t; if(i==l)t=r-l+1; else if(l==r)t=1; else t=1LL*(r-i+1)*(i-l+1); ans+=t; // printf("%lld\n",t); } printf("%lld\n",ans); return 0; }