「LAOI-4」石头
记
对于
假设最大值不位于端点即
则从
那么对于
综上对于区间最大值为
枚举
当最大值位于一个端点,假设位于
此时
同时
此时则要求
枚举
还要算上
所以计算贡献的时间复杂度是
问题转化成求每个位置
具体的,从小到大删去数,在删去之前从链表上找所在位置的前驱,前驱的前驱,后继,后继的后继即可。
所以总时间复杂度是
int main()
{
cin.tie(0),cout.tie(0);
ios::sync_with_stdio(0);
cin>>n>>s;srand_(s,n);
u[0]=0,v[0]=1,u[n+1]=n,v[n+1]=n+1;//初始化链表
for(int i=1;i<=n;++i)
b[a[i]]=i,u[i]=i-1,v[i]=i+1;
for(int i=1;i<=n;++i)
{
int cur=b[i];//找到 i 对应的位置
l[cur][0]=u[cur],l[cur][1]=u[u[cur]];
r[cur][0]=v[cur],r[cur][1]=v[v[cur]];
//下面计算第一部分,同时加上了 l=r 的情况
ans+=min(r[cur][0]-cur,cur-l[cur][0]);
u[v[cur]]=u[cur],v[u[cur]]=v[cur];
}
for(int q=1,p,cur;q<=n;++q)//计算第二部分
{
p=l[q][0],cur=r[p][0]-(p-l[q][1]);
if(cur>=q&&cur<r[q][0]) ++ans;
p=r[q][0],cur=l[p][0]+(r[q][1]-p);
if(cur>l[q][0]&&cur<=q) ++ans;
}
cout<<ans<<'\n';return 0;
}