【模板】回滚莫队&不删除莫队

II.【模板】回滚莫队&不删除莫队

莫,就硬莫。

代码:

#include<bits/stdc++.h>
using namespace std;
const int BBB=450;
int n,m,a[200100],mx[200100],mn[200100],ans,res[200100];
vector<int>v;
stack<pair<int,int> >s;
void Push(int x){
	if(x>mx[a[x]])s.emplace(a[x],mx[a[x]]),mx[a[x]]=x;
	if(x<mn[a[x]])s.emplace(-a[x],mn[a[x]]),mn[a[x]]=x;
	ans=max(ans,mx[a[x]]-mn[a[x]]);
}
void Restore(){
	if(s.top().first>0)mx[s.top().first]=s.top().second;
	else mn[-s.top().first]=s.top().second;
	s.pop();
}
struct query{
	int l,r,id;
	query(int L,int R,int ID){l=L,r=R,id=ID;}
	friend bool operator<(const query&u,const query&v){return u.r<v.r;}
};
vector<query>u[500];
int read(){
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')c=getchar();
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x;
}
int main(){
	n=read(),memset(mn,0x3f,sizeof(mn));
	for(int i=0;i<n;i++)v.push_back(a[i]=read());
	sort(v.begin(),v.end()),v.resize(unique(v.begin(),v.end())-v.begin());
	for(int i=0;i<n;i++)a[i]=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1;
	m=read();
	for(int i=1,l,r;i<=m;i++)l=read()-1,r=read()-1,u[l/BBB].emplace_back(l,r,i);
	for(int i=0;i*BBB<n;i++){
		sort(u[i].begin(),u[i].end());
		int lim=min((i+1)*BBB,n);
		int L=lim,R=L-1;ans=0;
		for(auto x:u[i]){
			if(x.r<lim){
				for(int j=x.l;j<=x.r;j++)Push(j);
				res[x.id]=ans,ans=0;
				while(!s.empty())Restore();
				continue;
			}
			while(R<x.r)Push(++R);
			int tsz=s.size(),tas=ans;
			while(L>x.l)Push(--L);
			res[x.id]=ans,ans=tas,L=lim;
			while(s.size()>tsz)Restore();
		}
		while(!s.empty())Restore();
	}
	for(int i=1;i<=m;i++)printf("%d\n",res[i]);
	return 0;
}

posted @   Troverld  阅读(42)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示