大常数萌新求助回滚莫队,14pts TLE/kel
查看原帖
大常数萌新求助回滚莫队,14pts TLE/kel
171487
cmll02楼主2021/4/18 15:00

charm1女装

// Problem: AT1219 歴史の研究
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT1219
// Memory Limit: 500 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include <stdio.h>
#include <string.h> 
#include <algorithm>
#include <queue>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
inline int read()
{
	int num=0,f=1;char c=getchar();
	while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
	while(c>47&&c<58)num=num*10+(c^48),c=getchar();
	return num*f;
}
inline int re1d()
{
	char c=getchar();
	while(c<48||c>49)c=getchar();
	return c&1;
}
inline int min(int a,int b){return a>b?b:a;}
inline int max(int a,int b){return a<b?b:a;}
struct Queries{
	int l,r,lb,rb,i;
	bool operator<(const Queries &b)const
	{
		return lb==b.lb?r<b.r:lb<b.lb;
	}
}q[200005];
int a[200005],c[200005];
gp_hash_table<int,int> L,R,tL,tR;
//int L[200005],R[200005],tL[200005],tR[200005];
const int B=450;
int ans=0;
//#define add(x) if(b[a[x]])ans=max(ans,a[x])
inline void add(int x)
{
	if(L[a[x]]==0)
	{
		L[a[x]]=R[a[x]]=x;
		return;
	}
	ans=max(ans,max(x-L[a[x]],R[a[x]]-x));
	L[a[x]]=min(L[a[x]],x);
	R[a[x]]=max(R[a[x]],x);
}
signed main()
{
	int n=read();//,m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	int m=read();
	for(int i=1;i<=m;i++)q[i].i=i,q[i].l=read(),q[i].r=read(),q[i].lb=q[i].l/B,q[i].rb=q[i].r/B;
	std::sort(q+1,q+1+m);q[0].lb=-1;
	int cl=1,cr=0;
	for(int i=1;i<=m;i++)
	{
		int l=q[i].l,r=q[i].r,lb=q[i].lb,rb=q[i].rb;
		if(lb==rb)
		{
			L.clear();
			R.clear();
			cl=l,cr=l-1,ans=0;
			while(cr<r)++cr,add(cr);
			c[q[i].i]=ans;
//			for(int i=l;i<=cr;i++)b[a[i]]--;
			L.clear();R.clear();
			cl=(lb+1)*B,cr=cl-1,ans=0;
			continue;
		}
		int t;
		if(q[i].lb!=q[i-1].lb)ans=0,cl=(lb+1)*B,cr=cl-1,L.clear(),R.clear();
		while(cr<r)++cr,add(cr);
		t=ans;
		int Q=cl;
		//		tL=L,tR=R;
		for(int i=l;i<cl;i++)tL[a[i]]=L[a[i]],tR[a[i]]=R[a[i]];
		while(Q>l)--Q,add(Q);
		for(int i=Q;i<cl;i++)L[a[i]]=tL[a[i]],R[a[i]]=tR[a[i]];
		//L=tL,R=tR;
		c[q[i].i]=ans;
		ans=t;
	}
	for(int i=1;i<=m;i++)printf("%d\n",c[i]);
}
2021/4/18 15:00
加载中...