求调教
查看原帖
求调教
754502
_AyachiNene楼主2023/3/10 20:43
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,_max;
}a[114514*3*4];
struct node1
{
	int l,r,_min=INT_MAX;
}a1[114514*3*4];
int ans[114514*3];
int n,b[114514*3],Van,Ass;
void bld(int l,int r,int root)
{
	a[root].l=l;
	a[root].r=r;
	if(l==r)
	{
		a[root]._max=b[l];
		return;
	}
	int mid=(l+r)/2;
	bld(l,mid,root*2);
	bld(mid+1,r,root*2+1);
	a[root]._max=max(a[root*2]._max,a[root*2+1]._max);
}
void bld_min(int l,int r,int root)
{
	a1[root].l=l;
	a1[root].r=r;
	if(l==r)
	{
		a1[root]._min=b[l];
		return;
	}
	int mid=(l+r)/2;
	bld_min(l,mid,root*2);
	bld_min(mid+1,r,root*2+1);
	a1[root]._min=min(a1[root*2]._min,a1[root*2+1]._min);
}
void max_(int x,int y,int root,int k)
{
	if(x<=a[root].l&&a[root].r<=y)
	{
		if(b[k]>a[root]._max)
			Ass=max(a[root]._max,Ass);
		return;
	}
	int mid=(a[root].l+a[root].r)/2;
	if(x<=mid)
		max_(x,y,root*2,k);
	if(y>mid)
		max_(x,y,root*2+1,k);
}
void min_(int x,int y,int root,int k)
{
	if(x<=a1[root].l&&a1[root].r<=y)
	{
		if(b[k]<a1[root]._min)
			Van=min(a1[root]._min,Van);
		return;
	}
	int mid=(a1[root].l+a1[root].r)/2;
	if(x<=mid)
		min_(x,y,root*2,k);
	if(y>mid)
		min_(x,y,root*2+1,k);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>b[i];
	bld(1,n,1);
	bld_min(1,n,1);
	ans[b[1]]=0;
	for(int i=2;i<=n;i++)
	{
		ans[0]=-114514;
		Van=INT_MAX;//大于它的最小值  
		Ass=-114;//小于它的最大值
		max_(1,i-1,1,i);
		min_(1,i-1,1,i);
		if(Van==INT_MAX)
			Van=0;
		if(Ass==-114)
			Ass=0;
		int k;
		if(ans[Ass]<ans[Van])
			k=Van;
		else
			k=Ass;
		ans[b[i]]=ans[k]+1;
//		cout<<Van<<" "<<Ass<<endl;
	}
	int sum=0;
	cout<<0<<endl;
	for(int i=2;i<=n;i++)
	{
		sum+=ans[b[i]];
		cout<<sum<<endl;
	}
	
}
2023/3/10 20:43
加载中...