22分求助
查看原帖
22分求助
310581
ethan0328楼主2024/2/29 23:06

过了前三个点和最后一个点。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+10;
int n,m,ind,ans,a[N],b[N],h[N],t[N],h2[N],t2[N],out[N];
int B,nl[N],nr[N],pos[N];
struct que
{
	int lb,rb,id;
	bool operator <(const que x) const
	{
		if(pos[lb]==pos[x.lb])
		{
			return rb<x.rb;
		}
		return lb<x.lb;
	}
};
que q[N];
signed main()
{
	int lst,x;
	cin>>n;
	B=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[++ind]=a[i];
	}
	sort(b+1,b+1+ind);
	ind=unique(b+1,b+1+ind)-b-1;
	for(int i=1;i<=n;i++)
	{
		a[i]=upper_bound(b+1,b+1+ind,a[i])-b-1;
		pos[i]=(i+B-1)/B;
	}
	for(int i=1;i<=n/B;i++)
	{
		nl[i]=(i-1)*B+1;
		nr[i]=i*B;
	}
	if(nr[n/B]<n)
	{
		nl[n/B+1]=nr[n/B]+1;
		nr[n/B+1]=n;
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].lb>>q[i].rb;
		q[i].id=i;
	}
	sort(q+1,q+1+m);
	lst=0;
	for(int i=1,l=1,r=0;i<=m;i++)
	{
//		cout<<":::"<<q[i].lb<<" "<<q[i].rb<<"\n";
		if(pos[q[i].lb]==pos[q[i].rb])
		{
			x=0;
			for(int j=q[i].lb;j<=q[i].rb;j++)
			{
				if(!h2[a[j]])
				{
					h2[a[j]]=j;
				}
				t2[a[j]]=max(t2[a[j]],j);
				x=max(x,t2[a[j]]-h2[a[j]]);
			}
			for(int j=q[i].lb;j<=q[i].rb;j++)
			{
				h2[a[j]]=t2[a[j]]=0;
			}
			out[q[i].id]=x;
			continue;
		}
		if(pos[q[i].lb]!=lst)
		{
			for(int j=l;j<=r;j++)
			{
				h2[a[j]]=t2[a[j]]=0;
			}
			ans=0;
			l=nr[pos[q[i].lb]]+1;
			r=nr[pos[q[i].lb]];
			lst=pos[q[i].lb];
		}
		while(r<q[i].rb)
		{
			r++;
			if(!h[a[r]])
			{
				h[a[r]]=r;
			}
			t[a[r]]=max(t[a[r]],r);
			ans=max(ans,t[a[r]]-h[a[r]]);
		}
		x=ans;
		while(l>q[i].lb)
		{
			l--;
			if(!t2[a[l]])
			{
				t2[a[l]]=l;
			}
			ans=max(ans,max(t2[a[l]],t[a[l]])-l);
		}
		out[q[i].id]=ans;
		ans=x;
		for(int j=l;j<=nr[pos[q[i].lb]];j++)
		{
			t2[a[j]]=0;
		}
		l=nr[pos[q[i].lb]]+1;
	}
	for(int i=1;i<=m;i++)
	{
		cout<<out[i]<<"\n";
	}
}
2024/2/29 23:06
加载中...