ST表

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 
const int N=1e6+5;
const int M=25;
const int mod=1e9+7;
int fx[N][M],fi[N][M];
int a[N],b[N];
int n,k;
int p[M];
int lg[N];
void STx() 
{
    for(int i=1; i<=n; i++) fx[i][0]=a[i];
    for(int j=1; p[j]<=n; j++) 
	{
        for(int i=1; i+p[j]-1<=n; i++) 
		{
            fx[i][j]=max(fx[i][j-1],fx[i+p[j-1]][j-1]);
        }
    }
}
int mx(int l,int r) 
{
    int len=lg[r-l+1];
    return max(fx[l][len],fx[r-p[len]+1][len]);
}

void STi() 
{
    for(int i=1; i<=n; i++) fi[i][0]=b[i];
    for(int j=1;p[j]<=n; j++) 
	{
        for(int i=1; i+p[j]-1<=n; i++) 
		{
            fi[i][j]=min(fi[i][j-1],fi[(i+p[j-1])][j-1]);
        }
    }
}

int mi(int l,int r) 
{
    int len=lg[r-l+1];
  //  cout<<len<<'\n';
//    cout<<fi[l][len]<<' '<<fi[r-p[len]+1][len]<<'\n';
    return min(fi[l][len],fi[r-p[len]+1][len]);
}

int askl(int l,int rl)
{
	int res=n;
	int L=l,R=rl;
	while(L<=R)
	{
		int mid=(L+R)>>1;
		if(mx(l,mid)>=mi(l,mid))
		{
			res=min(res,mid);
			R=mid-1;
		}
		else L=mid+1;
	}
	if(mx(l,res)!=mi(l,res))	return 0;
	return res;	
}

int askr(int l,int rr)
{
	int res=l;
	int L=l,R=rr;
	while(L<=R)
	{
		int mid=(L+R)>>1;
		if(mx(l,mid)<=mi(l,mid))
		{
			res=max(res,mid);
			L=mid+1;
		}
		else R=mid-1;
	}
	if(mx(l,res)!=mi(l,res))	return -1;
	return res;	
}

int main()
{
	scanf("%d%d",&n,&k);
	p[0]=1;
	for(int i=1;i<=25;i++)	p[i]=p[i-1]*2;
	lg[1]=0;
	for(int i=2;i<=n;i++)	lg[i]=lg[i/2]+1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		b[i]=a[i]+k;
	}
	ll ans=0;
    STi();
    STx();
	for(int i=1;i<=n;i++)
	{
		ans+=(askr(i,n)-askl(i,n)+1);
	}
	printf("%lld\n",ans);
	return 0;
}
全部评论

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务