灵异事件询问原因 改写了二分后cout影响最终输出结果
查看原帖
灵异事件询问原因 改写了二分后cout影响最终输出结果
1045084
liuzhiyi0803楼主2023/11/17 17:11
#include<bits/stdc++.h>
using namespace std;
int n;
const int maxn=5e5+10;
int h[maxn];
int s[maxn];
int tail;
long long ans;
int find1(int x)
{
	int l=0,r=tail,res;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(h[s[mid]]>x)
		{
			res=mid;
			l=mid+1;
		}
		else
			r=mid-1;
	}
	return res;
}
int find2(int x)
{
	int l=0,r=tail,res;
	while(l<=r)
	{
		int mid=(l+r)>>1;
		if(h[s[mid]]>=x)
		{
			res=mid;
			l=mid+1;
		}
		else
			r=mid-1;
	}
	return res;
}
//int find1(int x)
//{
//	int l=0,r=tail;
//	while(l<r)
//	{
//		int mid=(l+r+1)>>1;
//		if(h[s[mid]]>x)
//			l=mid;
//		else
//			r=mid-1;
//	}
//	return l;//在s里的下标 
//}
//int find2(int x)
//{
//	int l=0,r=tail;
//	while(l<r)
//	{
//		int mid=(l+r+1)>>1;
//		if(h[s[mid]]>=x)
//			l=mid;
//		else
//			r=mid-1;
//	}
//	return l;//在s里的下标 
//}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		h[i]=x;
	}
	for(int i=1;i<=n;i++)
	{
		if(tail>0&&h[i]>=h[s[tail]])
		{
			int y=find1(h[i]);
			int z=find2(h[i]);
			if(y==0)
			{
				ans+=tail;
			}
			else
			{
//				cout<<i<<" "<<tail-y+1<<endl;
//将这一行注销后ans输出9,不注释输出10
//				cout<<1<<endl;
				ans+=tail-y+1;
			}
			tail=z;
		}
		else if(h[i]<h[s[tail]])
		{
			ans++;
		}
			
		s[++tail]=i;
	}
	cout<<ans;
	return 0;
}
2023/11/17 17:11
加载中...