题意:求子区间mex>med的个数。
分析:想到了是双指针,但不知道怎么才能有单调性。考虑升序枚举x,再用双指针维护mex=x的区间,这样区间只会不断扩大。如果当前mex=x,那么mex>med的区间长度最长为2x,双指针往pox[x]的那边扩展同时计算贡献即可。当x=n时,贡献为1。
代码:
int pos[maxn];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
pos[x]=i;
}
int l=pos[0],r=pos[0],ans=1;
for(int x=1;x<=n-1;x++)
{
if(pos[x]>=l&&pos[x]<=r) continue;
int len=2*x;
if(pos[x]>r)
{
for(int i=r;i<pos[x];i++)
{
int j=max(1ll,i-len+1);
ans+=max(0ll,l-j+1);
}
}
else
{
for(int i=l;i>pos[x];i--)
{
int j=min(n,i+len-1);
ans+=max(0ll,j-r+1);
}
}
l=min(l,pos[x]);
r=max(r,pos[x]);
}
cout<<ans<<endl;
}