P5724 【深基4.习5】求极差 / 最大跨度值20pts求条
  • 板块灌水区
  • 楼主Z_L_H
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/1/15 14:48
  • 上次更新2025/2/5 14:13:37
查看原帖
P5724 【深基4.习5】求极差 / 最大跨度值20pts求条
1510234
Z_L_H楼主2025/1/15 14:48
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int stmin[100005][21],mimin[100005][21];
int stmax[100005][21],mimax[100005][21];
int lg[100005];
int n;
void initial()
{
	memset(stmin,0x3f,sizeof(stmin));
	memset(stmax,0x3f,sizeof(stmax));
	for(int i = 1;i <= n;i ++)
	{
		stmin[i][0] = stmax[i][0] = a[i];
		mimax[i][0] = mimin[i][0] = i;
	}
	for(int i = 2;i <= n;i ++)
	{
		lg[i] = lg[i / 2] + 1;
	}
	for(int len = 1;len <= lg[n];len ++)
	{
		for(int i = 1;i - 1 + (1 << len) <= n;i ++)
		{
			stmin[i][len] = min(stmin[i][len - 1],stmin[i + (1 << len - 1)][len - 1]);
			if(stmin[i][len - 1] <= stmin[i + (1 << len - 1)][len - 1])
			{
				mimin[i][len] = mimin[i][len - 1];
			}
			else
			{
				mimin[i][len] = mimin[i + (1 << len - 1)][len - 1];
			}
		}
	}
	for(int len = 1;len <= lg[n];len ++)
	{
		for(int i = 1;i - 1 + (1 << len) <= n;i ++)
		{
			stmax[i][len] = max(stmax[i][len - 1],stmax[i + (1 << len - 1)][len - 1]);
			if(stmax[i][len - 1] <= stmax[i + (1 << len - 1)][len - 1])
			{
				mimax[i][len] = mimax[i][len - 1];
			}
			else 
			{
				mimax[i][len] = mimax[i + (1 << len - 1)][len - 1];
			}
		}
	}
}
int intervalmaxid(int l,int r)
{
	if(stmax[l][lg[r - l + 1]] <= stmax[r - (1 << (lg[r - l + 1])) + 1][lg[r - l + 1]])
	{
		return mimax[l][lg[r - l + 1]];
	}
	else 
	{
		return mimax[r - (1 << (lg[r - l + 1])) + 1][lg[r - l + 1]];
	}
}
int intervalminid(int l,int r)
{
	if(stmin[l][lg[r - l + 1]] <= stmin[r - (1 << (lg[r - l + 1])) + 1][lg[r - l + 1]])
	{
		return mimin[l][lg[r - l + 1]];
	}
	else 
	{
		return mimin[r - (1 << (lg[r - l + 1])) + 1][lg[r - l + 1]];
	}
}
int main()
{
	cin>>n;
	for(int i = 1;i <= n;i ++)
	{
		cin>>a[i];
	}
	initial();
	int maxpos = intervalmaxid(1,n);
	int minpos = intervalminid(1,n);
	cout<<a[maxpos] - a[minpos];
	return 0;
}
2025/1/15 14:48
加载中...