疑惑
查看原帖
疑惑
181521
珈乐唯毒楼主2021/3/15 21:28

大部分的AC代码时间在2至3秒左右,为什么这份代码大约6秒。是写法有问题吗?

#include<bits/stdc++.h>
#define bl(x) block(x)
using namespace std;
const int N=200005;
int ans,n,m,nf;
int ba[N],a[N],lp[N],rp[N],l,r;
struct Origin{int pos,num;}ori[N];
bool cmppp(Origin i,Origin j){return i.num<j.num;}
struct Modui{int l,r,an,nu;}q[N];
int block(int x){return (x-1)/nf+1;}
bool cmp(Modui i,Modui j){
	if(bl(i.l)==bl(j.l))return i.r<j.r;
	return i.l<j.l;
}
bool cmpp(Modui i,Modui j){return i.nu<j.nu;}
struct ZT{int pos,lo,ro,oans;};
stack<ZT> s;
inline void getback(){
	int pos=s.top().pos,lo=s.top().lo,ro=s.top().ro,oans=s.top().oans;
	lp[pos]=lo,rp[pos]=ro,ans=oans;
	s.pop();
	return;
}
inline void add(int x){
	s.push((ZT){a[x],lp[a[x]],rp[a[x]],ans});
	lp[a[x]]=min(x,lp[a[x]]);
	rp[a[x]]=max(x,rp[a[x]]);
	ans=max(rp[a[x]]-lp[a[x]],ans);
}
int main(){
	scanf("%d",&n);
	nf=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%d",&ori[i].num);
		ori[i].pos=i;
	}
	sort(ori+1,ori+n+1,cmppp);
	int tot=0;
	for(int i=1;i<=n;i++){
		if(ori[i].num!=ori[i-1].num)tot++;
		ba[tot]=ori[i].num;
		a[ori[i].pos]=tot;
	}
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].nu=i;
	}
	sort(q+1,q+m+1,cmp);
	memset(lp,0x3f,sizeof(lp));
	for(int i=1;i<=m;i++){
		if(bl(q[i].l)!=bl(q[i-1].l)||q[i-1].l==0){
			int lbl=bl(q[i].l)*nf+1;
			l=min(n+1,lbl);
			r=l-1;
			while(!s.empty())getback();
		}
		if(bl(q[i].l)==bl(q[i].r)){
			for(int j=q[i].l;j<=q[i].r;j++)add(j);
			q[i].an=ans;
			while(!s.empty())getback();
			continue;
		}
		while(r<q[i].r)add(++r);
		int num=0;
		while(l>q[i].l){
			num++;
			add(--l);
		}
		q[i].an=ans;
		l=bl(q[i].l)*nf+1;
		while(num--)getback();
	}
	sort(q+1,q+m+1,cmpp);
	for(int i=1;i<=m;i++)printf("%d\n",q[i].an);
	return 0;
}
2021/3/15 21:28
加载中...