CF1175E,样例过不去/kk
#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+7;
int a[MAXN],s[MAXN],pre[MAXN],mp[MAXN],ans;
mt19937 myrand(time(0));
int main()
{
int n;
scanf("%d",&n);
for(int i(1);i<=n;++i)
{
scanf("%d",&a[i]);
mp[a[i]]=myrand();
pre[i]=pre[i-1]^mp[a[i]];
}
for(int i(1);i<=n;++i)
s[i]=s[i-1]^mp[i];
for(int i(1);i<=n;++i)
{
if(a[i]==1)
{
int maxe=1;
ans++;
for(int j(i+1);j<=n&&a[j]!=1;++j)
{
maxe=max(maxe,a[j]);
if(j>=maxe&&j-maxe+1<=i&&s[maxe]==pre[j]^pre[j-maxe])
ans++;
}
}
}
reverse(a+1,a+n+1);
for(int i(1);i<=n;++i)
pre[i]=pre[i-1]^mp[a[i]];
for(int i(1);i<=n;++i)
{
if(a[i]==1)
{
int maxe=1;
for(int j(i+1);j<=n&&a[j]!=1;++j)
{
maxe=max(maxe,a[j]);
if(j>=maxe&&j-maxe+1<=i&&s[maxe]==pre[j]^pre[j-maxe])
ans++;
}
}
}
printf("%d",ans);
return 0;
}