转载大佬博客沉迷学习的LJY

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[201010],ans[101010];
int maxx[201010][20],minn[201010][20];
int Maxx,Minn=2e9;
int ST_min(int l,int r)
{
int len=r-l+1;
int k=log2(len);
if(a[minn[l][k]]<a[minn[r-(1<<k)+1][k]])
return minn[l][k];
return minn[r-(1<<k)+1][k];
}
int ST_max(int l,int r)
{
int len=r-l+1;
int k=log2(len);
if(a[maxx[l][k]]>a[maxx[r-(1<<k)+1][k]])
return maxx[l][k];
return maxx[r-(1<<k)+1][k];
}
int get_min(int l,int r)
{
int p=a[l-1];
while(l<r)
{
int mid=(l+r)>>1;
if(2*a[ST_min(l,mid)]>=p)
l=mid+1;
else
r=mid;
}
return l;
}
int get_max(int l,int r)
{
int p=a[l-1];
while(l<r)
{
int mid=(l+r)>>1;
if(a[ST_max(l,mid)]<p)
l=mid+1;
else
r=mid;
}
return l;
}
int solve(int x)
{
if(ans[x])
return ans[x];
int ans1=get_min(x+1,x+n);
int ans2=get_max(x+1,x+n);
if(ans1<ans2)
return ans[x]=ans1-x;
else
return ans[x]=ans2-x+solve((ans2-1)%n+1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];
maxx[i][0]=minn[i][0]=i;
maxx[i+n][0]=minn[i+n][0]=i+n;
Maxx=max(Maxx,a[i]);
Minn=min(Minn,a[i]);
}
if(Minn*2>=Maxx)
{
for(int i=1;i<=n;i++)
printf("-1 ");
return 0;
}
for(int k=1;k<=18;k++)
{
int len=1<<k;
for(int i=1;i+len-1<=2*n;i++)
{
int j=i+len-1,m=j-(len>>1)+1;
if(a[maxx[i][k-1]]>=a[maxx[m][k-1]])
maxx[i][k]=maxx[i][k-1];
else
maxx[i][k]=maxx[m][k-1];
if(a[minn[i][k-1]]<=a[minn[m][k-1]])
minn[i][k]=minn[i][k-1];
else
minn[i][k]=minn[m][k-1];
}
}
for(int i=1;i<=n;i++)
ans[i]=solve(i);
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}