为啥回滚莫队28全T啊||玄关
查看原帖
为啥回滚莫队28全T啊||玄关
989997
DGL__DGL_AFO楼主2024/10/30 20:27

本地第四个样例点跑了30s+,答案是对的

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
ll a[214514];
int len;
struct Q
{
	int l,r;
	int id;
} q[214514];
struct Node
{
	int l,r;
	int cnt;
} ;
unordered_map<ll,Node> st,un;
int rn,cnt;
int res,op;
int ans[214514];
vector<int> v,vv;

inline bool cmp(Q a,Q b)
{
	if((a.l-1)/len!=(b.l-1)/len)  return a.l<b.l;
	return a.r<b.r;
}

inline void MER()
{
	for(int i=1;i<=m;i++)
	{
		int l=q[i].l,r=q[i].r;
		int ls=(l-1)/len+1,rs=(r-1)/len+1;
		if(ls==rs)
		{
			st.clear();
			res=0;
			for(int j=l;j<=r;j++)
			{
				if(!st[a[j]].cnt)
				{
					st[a[j]].cnt=1;
					st[a[j]].l=j;
					st[a[j]].r=j;
				}
				else
				{
					res=max(res,j-st[a[j]].l);
					st[a[j]].r=j;
				}
			}
			/*for(int i=v.size()-1;i>=0;i--)
			{
				st[v[i]].cnt=0;
				st[v[i]].l=0;
				st[v[i]].r=0;
				v.pop_back();  
			}*/
			ans[q[i].id]=res;
		}
		else
		{
			if(cnt!=ls+1)
			{
				st.clear();
				/*for(int i=v.size()-1;i>=0;i--)
				{
					st[v[i]].cnt=0;
					st[v[i]].l=0;
					st[v[i]].r=0;
					v.pop_back();  
				}*/
				res=0;
				cnt=ls+1;
				rn=ls*len;
			}
			while(rn<r)
			{
				rn++;
				if(!st[a[rn]].cnt)
				{
					st[a[rn]].cnt=1;
					st[a[rn]].l=rn;
					st[a[rn]].r=rn;
				//	v.push_back(a[rn]);
				}
				else
				{
					res=max(res,rn-st[a[rn]].l);
					st[a[rn]].r=rn;
				}
			}
			/*for(int i=vv.size()-1;i>=0;i--)
			{
				un[vv[i]].cnt=0;
				un[vv[i]].l=0;
				un[vv[i]].r=0;
				vv.pop_back();  
			}*/
			un.clear();
			op=res;
			for(int j=l;j<=ls*len;j++)
			{
				if(!un[a[j]].cnt&&!st[a[j]].cnt)
				{
					un[a[j]].cnt=1;
					un[a[j]].l=j;
					un[a[j]].r=j;
					//vv.push_back(a[i]);
				}
				else if(st[a[j]].cnt)
				{
					op=max(op,st[a[j]].r-j);
				}
				else
				{
					op=max(op,j-un[a[j]].l);
					un[a[j]].r=j;
				}
			}
			ans[q[i].id]=op;
		}
		
	}
}

int main()
{
	//freopen("P5906_4.in","r",stdin);
	//freopen("P5906.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].l>>q[i].r;
		q[i].id=i;
	}  
	
	sort(q+1,q+1+m,cmp);
	
	MER();
	
	for(int i=1;i<=m;i++)
	  cout<<ans[i]<<'\n';
	
	return 0;
}
2024/10/30 20:27
加载中...