题解:P17234 [Algo Beat Contest 017 C] 交互题
考虑枚举
随后,
综上,总方案数就是
实现的时候储存每个
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,ans;
vector<int>p[N];
#define cnt(x) (x)*(x+1)/2
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
cin>>n;
for(int i=0;i<N;i++) p[i].push_back(0);
for(int i=1;i<=n;i++){
int x;
scanf("%lld",&x);
p[x].push_back(i);
}
for(int i=0;i<N;i++) p[i].push_back(n+1);
if(p[0].size()!=2){//特判不存在
for(int i=1;i<p[0].size();i++) ans+=cnt(p[0][i]-p[0][i-1]-1);//i=0 的情况
int l=n+1,r=0;//此处的 l,r 为上文的 x,y
for(int c=1;c<N;c++){
if(p[c].size()==2) break ;//特判不存在
l=min(l,p[c-1][1]);
r=max(r,p[c-1][p[c-1].size()-2]);
if(*lower_bound(p[c].begin(),p[c].end(),l)<=r) continue ;
int L=p[c][lower_bound(p[c].begin(),p[c].end(),l)-p[c].begin()-1];
int R=p[c][upper_bound(p[c].begin(),p[c].end(),r)-p[c].begin()];
ans+=(l-L)*(R-r);
}
}
cout<<ans<<'\n';
return 0;
}/*
*/