过了,但有疑问
查看原帖
过了,但有疑问
351679
shaun2000楼主2025/1/27 20:47

为什么第二个二分在跑样例1时会死循环?

record

#include<bits/stdc++.h>
#define ll long long
#define log djkdjdjjd
using namespace std;
int log[200005];
ll a[200005],b[200005];
ll sta[200005][40],stb[200005][40];
ll ra(int l,int r){
	int len=log[r-l+1];
	//printf("len=%d\n",r-(1<<len)+1);
	
	return max(sta[l][len],sta[r-(1<<len)+1][len]);
}
ll rb(int l,int r){
	int len=log[r-l+1];
	return min(stb[l][len],stb[r-(1<<len)+1][len]);
}
int main()
{
	for(int i=1;i<=200000;i++)
	{
		if(i%2==0)
		{
			log[i]=log[i/2]+1;
		}
		else
			log[i]=log[i-1];
	}
	//printf("%d\n",log[7]);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
		scanf("%lld",&b[i]);
	for(int i=1;i<=n;i++)
		sta[i][0]=a[i],stb[i][0]=b[i];
	for(int l=1;l<=20;l++)
	{
		int r=1<<l;
		for(int i=1;i+r-1<=n;i++)
		{
			sta[i][l]=max(sta[i][l-1],sta[i+(1<<(l-1))][l-1]);
			stb[i][l]=min(stb[i][l-1],stb[i+(1<<(l-1))][l-1]);
		}
	}
	//printf("%d\n",sta[2][2]);
	//printf("%d\n",ra(5,5));
	//return 0;
	ll ans=0;
	for(int i=1;i<=n;i++)
	{
		ll l1=i,r1=n,l2=i,r2=n,mid;
		int tmp=0;
		while(l1<r1)
		{
			tmp++;
			if(tmp>100)
				break;
			mid=(l1+r1)/2;
			if(ra(i,mid)<rb(i,mid))
			{
				l1=mid+1;
			}
			else if(ra(i,mid)>rb(i,mid))
			{
				r1=mid-1;
			}
			else
			{
				r1=mid;
			}
		}
		if(l1!=i && ra(i,l1-1)==rb(i,l1-1))
			l1--;
		tmp=0;
		while(l2<r2)
		{
			
			tmp++;
			if(tmp>100)
				break;
			mid=(l2+r2)/2;
			
			//printf("%d %d\n",l2,r2);
			if(ra(i,mid)<rb(i,mid))
			{
				l2=mid+1;
			}
			else if(ra(i,mid)>rb(i,mid))
			{
				r2=mid-1;
			}
			else
			{
				l2=mid;
			}
		}
		if(l2!=n && ra(i,l2+1)==rb(i,l2+1))
			l2++;
		//printf("i=%d l1=%d l2=%d\n",i,l1,l2);
		//printf("%d %d\n",ra(i,l1),rb(i,l1));
		if(ra(i,l1)==rb(i,r1) && ra(i,l2)==rb(i,l2))
			ans+=max(0ll,l2-l1+1);
	}
	printf("%lld",ans);
    return 0;
}
2025/1/27 20:47
加载中...