关于洛谷编译器
查看原帖
关于洛谷编译器
957589
xhhhh36楼主2024/4/10 17:17
#include <iostream>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;

const int N=2e5+5;
map<int,int>mp;
int n,m,len,a[N],b[N],ans[N];
struct opt{ int l,r,id; }t[N];
int cmp(opt x,opt y){ return b[x.l]==b[y.l]?x.r<y.r:x.l<y.l; }
int c[N],d[N],e[N],mx,s[N],top;
int calc(int l,int r){
	int ret=0;
	for(int i=l;i<=r;i++)
		c[a[i]]=c[a[i]]?c[a[i]]:i,ret=max(ret,i-c[a[i]]);
	for(int i=l;i<=r;i++)
		c[a[i]]=0;
	return ret;
}
void add1(int x){
	if(!e[a[x]]) s[++top]=a[x];
	c[a[x]]=c[a[x]]?c[a[x]]:x,e[a[x]]=x;
	mx=max(mx,x-c[a[x]]);
}
void add2(int x){
	d[a[x]]=d[a[x]]?d[a[x]]:x;
	mx=max(mx,max(e[a[x]],d[a[x]])-x);
}
int main(){
	scanf("%d",&n);
	int tot=0;
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		if(!mp[a[i]]) mp[a[i]]=++tot;
		a[i]=mp[a[i]];
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
		scanf("%d%d",&t[i].l,&t[i].r),t[i].id=i;
	len=sqrt(n);
	for(int i=1;i<=n;i++)
		b[i]=(i-1)/len+1;
	sort(t+1,t+1+m,cmp);
	for(int i=1;i<=m;){
		int now=b[t[i].l];
		int l=now*len+1,r=now*len;
		mx=0;
		for(;b[t[i].l]==now;i++){
			int u=t[i].l,v=t[i].r;
			if(b[u]==b[v]){
				ans[t[i].id]=calc(u,v);
				continue;
			}
			while(r<v) add1(++r);
			int tmp=mx;
			while(l>u) add2(--l);
			ans[t[i].id]=mx;
			mx=tmp;
			for(;l<=now*len;l++) d[a[l]]=0;
		}
		while(top) c[s[top]]=e[s[top--]]=0;
	}
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);

	return 0;
}

这份代码可以通过本题,但是将

while(top) c[s[top]]=e[s[top--]]=0;

改为:

while(top) e[s[top]]=c[s[top--]]=0;

却只有 28pts28pts,记录。

并且两份代码本地都能过第四个数据点。

2024/4/10 17:17
加载中...