如果hash搞的话,O(n)就可以了,可是不怎么会hash,xjb搞了一发,把一个序列转换成了两个值,用两个值来确定一个序列。果然wa
用俩set,从前向后扫,得到一个集合,从后向前扫,得到一个集合。俩集合相等,则找到了符合条件的集合
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50010;
set<int> cnt,rec;
int num[MAXN];
int flag[MAXN];
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n; ++i)
scanf("%d",&num[i]);
int res = 0;
int j = n-1;
for(int i = 0; i < n; ++i)
{
cnt.insert(num[i]);
while(j >= 0 && cnt.count(num[j]) != 0)
{
flag[j] = 1;
rec.insert(num[j]);
j--;
while(j >= 0 && rec.count(num[j]) != 0)
{
flag[j] = flag[j+1]+1;
j--;
}
}
if(cnt.size() == rec.size())
res += flag[j+1];
}
printf("%d\n",res);
return 0;
}