一个巨大的疑惑
查看原帖
一个巨大的疑惑
749630
wxzzzz楼主2024/3/30 16:13

为什么下面 AC 代码中打标记的两行换成注释的两行就会 WA?历史研究写的那注释的两行的写法都 A 了。

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define rll register ll
#define cll const ll
#define N 200005
using namespace std;
inline ll read()
{
    rll x=0;bool f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-') f=0;c=getchar();}
    while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
inline void write(ll x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
cll n=read(),L=sqrt(n);
ll m,nv,now,a[N],b[N],bl[N],br[N],val[N],ans[N],maxn[N],minn[N],mint[N];
struct tmp{ll l,r,id;}q[N];
inline bool cmp(tmp x,tmp y)
{
	if(b[x.l]==b[y.l])
		return x.r<y.r;
	return b[x.l]<b[y.l];
}
inline void addr(ll x)
{
	maxn[a[x]]=x;
	if(!minn[a[x]]) minn[a[x]]=x;
	now=max(now,maxn[a[x]]-minn[a[x]]);
}
inline void addl(ll x)
{
	if(!maxn[a[x]]) maxn[a[x]]=x;
	now=max(now,maxn[a[x]]-x);
}
inline void del(ll x)
{
	maxn[a[x]]=0;
	minn[a[x]]=0;
}
inline void dell(ll x)
{
	if(maxn[a[x]]==x)
		maxn[a[x]]=0;
}
int main()
{
	for(rll i=1;i<=(n+L-1)/L;i++)
	{
		bl[i]=br[i-1]+1,br[i]=min(bl[i]+L-1,n);
		for(rll j=bl[i];j<=br[i];j++)
			a[j]=val[j]=read(),b[j]=i;
	}
	sort(val+1,val+n+1);
	nv=unique(val+1,val+n+1)-val-1;
	for(rll i=1;i<=n;i++)
		a[i]=lower_bound(val+1,val+nv+1,a[i])-val;
	m=read();
	for(rll i=1;i<=m;i++)
	{
		q[i].l=read(),q[i].r=read();
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	for(rll i=1,l=1,r=0,tmp,last=0;i<=m;i++)
	{
		if(b[q[i].l]==b[q[i].r])
		{
			for(rll j=q[i].l;j<=q[i].r;j++)
			{
				if(!mint[a[j]]) mint[a[j]]=j;
				ans[q[i].id]=max(ans[q[i].id],j-mint[a[j]]);
			}
			for(rll j=q[i].l;j<=q[i].r;j++)
				mint[a[j]]=0;
			continue;
		}
		if(b[q[i].l]!=last)
		{
			for(rll j=1;j<=nv;j++)
				maxn[j]=minn[j]=0;
			l=br[b[q[i].l]]+1; //←
			r=br[b[q[i].l]];   //←
			//while(l<br[b[q[i].l]]+1) l++;
			//while(r>br[b[q[i].l]]) r--;
			now=0;
			last=b[q[i].l];
		}
		while(r<q[i].r) addr(++r);
		tmp=now;
		l=br[b[q[i].l]]+1;
		while(l>q[i].l) addl(--l);
		ans[q[i].id]=now;
		now=tmp;
		while(l<br[b[q[i].l]]+1)
			dell(l++);
	}
	for(rll i=1;i<=m;i++)
		write(ans[i]),putchar('\n');
    return 0;
}
2024/3/30 16:13
加载中...