莫队套线段树 TLE#18 求条
查看原帖
莫队套线段树 TLE#18 求条
682739
CuteMurasame楼主2024/8/6 11:24
#pragma GCC optimize("Ofast,inline,no-stack-protector,unroll-loops,fast-math")
#include<bits/stdc++.h>
#define MX 1000000007
#define rep(i,a,b) for(int i(a);i<=(b);++i)
#define req(i,a,b) for(int i(a);i>=(b);--i)
using namespace std;
char buf[1<<23],*p1=buf,*p2=buf,ubuf[1<<23],*u=ubuf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
template<typename TP> inline TP read(TP &num)
{
	TP x=0;
	int f=0;
	char ch=getchar();
	while(ch<48||ch>57) f|=ch=='-',ch=getchar();
	while(48<=ch&&ch<=57) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return num=f?-x:x;
}
template<typename ...Args> inline void read(Args &...args)
{
	(read(args),...);
}
template<typename TP> inline void write(TP x)
{
	(x<0)?(putchar('-'),x=-x):0;
	(x>9)?(write(x/10),0):0;
	putchar((x%10)^48);
}
template<typename TP> inline void writeln(TP x)
{
	write<TP>(x);
	puts("");
}
int n,q,a[100001];
vector<pair<int,int>> unq;
int V[100001];
struct sgt_node
{
	int mx,mn,ans;
} sgt[400001];
int pos[400001],unqcnt;
void build(int node,int l,int r)
{
	sgt[node]={0,MX,MX};
	if(l==r) return pos[l]=node,void();
	int mid=(l+r)>>1;
	build(node<<1,l,mid);
	build(node<<1|1,mid+1,r);
}
inline void pushup(int node)
{
	sgt[node].mx=max(sgt[node<<1].mx,sgt[node<<1|1].mx);
	sgt[node].mn=min(sgt[node<<1].mn,sgt[node<<1|1].mn);
	sgt[node].ans=min(sgt[node<<1].ans,sgt[node<<1|1].ans);
	if(sgt[node<<1].mx&&sgt[node<<1|1].mn<=1e5)
		sgt[node].ans=min(sgt[node].ans,abs(V[sgt[node<<1].mx]-V[sgt[node<<1|1].mn]));
}
inline void modify(int pos,int val)
{
	pos=::pos[pos];
	if(!val) sgt[pos]={0,MX,MX};
	else sgt[pos]={val,val,MX};
	for(pos>>=1;pos;pos>>=1) pushup(pos);
}
int cnt[100001],ans0;
inline void emplace(int x)
{
	x=a[x];
	if(!(cnt[x]++)) modify(x,x);
	if(cnt[x]==2) ++ans0;
}
inline void erase(int x)
{
	x=a[x];
	if(!(--cnt[x])) modify(x,0);
	if(cnt[x]==1) --ans0;
}
struct query
{
	int l,r,id;
} qrs[300001];
int ans[300001],siz;
signed main()
{
	read(n);
	siz=sqrt(n);
	rep(i,1,n) read(a[i]),unq.emplace_back(a[i],i);
	sort(unq.begin(),unq.end());
	for(auto it=unq.begin();it!=unq.end();++it)
	{
		if(it!=unq.begin()&&it->first==prev(it)->first) --unqcnt;
		V[++unqcnt]=it->first;
		a[it->second]=unqcnt;
	}
	read(q);
	rep(i,1,q) read(qrs[i].l,qrs[i].r),qrs[i].id=i;
	sort(qrs+1,qrs+q+1,[](query a,query b)
			{
				return a.l/siz!=b.l/siz?a.l<b.l:a.l/siz%2?a.r<b.r:a.r>b.r;
			});
	build(1,1,unqcnt);
	int l=1,r=0;
	rep(i,1,q)
	{
		while(r<qrs[i].r) emplace(++r);
		while(l>qrs[i].l) emplace(--l);
		while(r>qrs[i].r) erase(r--);
		while(l<qrs[i].l) erase(l++);
		ans[qrs[i].id]=ans0?0:sgt[1].ans;
	}
	rep(i,1,q) writeln(ans[i]);
	return 0;
}
2024/8/6 11:24
加载中...