数据貌似水了
查看原帖
数据貌似水了
476620
TempestJueMu楼主2022/8/22 14:35

rt,n为平方数的时候我代码完全过不去。

顺便找个好心人看看我的分块哪里挂了。

#include<cstdio>
#include<cmath>
using namespace std;
int n,m,bl,idj,idk;
int a[100001];
int st[318],ed[318],bel[100001],siz[318];
int s1[318][318],s2[318][318],s3[318][318],s4[318][317*317+2];
int mp[318][318],tot=1;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline int max(int a,int b){return a>b?a:b;}
void init()
{
	bl=sqrt(n);
	if(bl*bl!=n)++bl;
	for(int i=0;i<=bl;++i)
        for(int j=0;j<=bl;++j)
            mp[i][j]=tot++;
    for(int i=1;i<=n;i++){
        bel[i]=((i-1)/(bl-1)+1);
        ed[bel[i]]=i;
    }
    for(int i=n;i>=1;i--){
        st[bel[i]]=i;
        siz[bel[i]]++;
    }
    ed[bl]=n;
	for(int i=1;i<=bl;++i)
	{
		for(int j=st[i];j<=ed[i];++j)
		{
			idj=j%siz[i];
			s1[i][idj]=max(a[j],s1[i][idj-1>=0?idj-1:idj-1+siz[i]]);
		}
		for(int j=ed[i];j>=st[i];--j)
		{
			idj=j%siz[i];
			s2[i][idj]=max(a[j],s2[i][idj+1<siz[i]?idj+1:idj+1-siz[i]]);
		}
	}
	for(int i=1;i<=bl;++i)
		for(int j=i;j<=bl;++j)
			s3[i][j]=max(s3[i][j-1],s1[j][ed[j]%siz[j]]);
	
	for(int i=1;i<=bl;++i)
		for(int j=st[i];j<=ed[i];++j)
		{
			idj=j%siz[i];
			for(int k=j;k<=ed[i];++k)
			{
				idk=k%siz[i];
				s4[i][mp[idj][idk]]=max(s4[i][mp[idj][idk-1>=0?idk-1:idk-1+siz[i]]],a[k]);
			}
		}
}
int query(int l,int r)
{
	if(bel[l]==bel[r])return s4[bel[l]][mp[l%siz[bel[l]]][r%siz[bel[l]]]];
	int ans=0;
	ans=max(ans,s2[bel[l]][l%siz[bel[l]]]);
	ans=max(ans,s1[bel[r]][r%siz[bel[r]]]);
	ans=max(ans,s3[bel[l]+1][bel[r]-1]);
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
		a[i]=read();
	init();
	for(int i=1,l,r;i<=m;++i)
		l=read(),r=read(),printf("%d\n",query(l,r));
	return 0;
}
2022/8/22 14:35
加载中...