求助。为什么会RE?
查看原帖
求助。为什么会RE?
632002
i_wzy楼主2024/11/23 16:55
#include<cstdio>
#include<cctype>
#include<algorithm>
using namespace std;
using ll=long long ;

namespace IO{
template<typename Type>void read(Type &x){
	x=0;int fl=0;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')	fl=1;
		ch=getchar();
	}
	while(isdigit(ch))	x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	if(fl) x=-x;
}
template<typename Type>void print(Type x){
	if(x<0)	x=-x,putchar('-');
	if(x>9)	print(x/10);
	putchar((int)(x%10)+'0');
}
template<typename Type>void print(Type x,char ch){
	print(x),putchar(ch);
}
}using namespace IO;

const int N=2e5+10;
int n,m,q,a[N],b[N],log_2[N];
int l1,r1,l2,r2;
ll f[10][N][40];

void ST_prework(){
	for(int i=2;i<=1e5;++i)	log_2[i]=log_2[i/2]+1;
	for(int i=1;i<=n;++i)	f[0][i][0]=f[1][i][0]=a[i];
	for(int i=1;i<=m;++i)	f[2][i][0]=f[3][i][0]=b[i];
	for(int k=1;k<=log_2[n];++k)
		for(int i=1;i<=n;++i)
			f[0][i][k]=max(f[0][i][k-1],f[0][i+(1<<(k-1))][k-1]),
			f[1][i][k]=min(f[1][i][k-1],f[1][i+(1<<(k-1))][k-1]);
	for(int k=1;k<=log_2[m];++k)
		for(int i=1;i<=m;++i)
			f[2][i][k]=min(f[2][i][k-1],f[2][i+(1<<(k-1))][k-1]),
			f[3][i][k]=max(f[3][i][k-1],f[3][i+(1<<(k-1))][k-1]);
	for(int i=1;i<=n;++i){
		b[i]=a[i];
		if(a[i]<0)	a[i]=1e9;
		if(b[i]>0)	b[i]=-1e9;
	}
	for(int i=1;i<=n;++i)	f[4][i][0]=a[i],f[5][i][0]=b[i];
	for(int k=1;k<=log_2[n];++k)
		for(int i=1;i<=n;++i)
			f[4][i][k]=min(f[4][i][k-1],f[4][i+(1<<(k-1))][k-1]),
			f[5][i][k]=max(f[5][i][k-1],f[5][i+(1<<(k-1))][k-1]);
}

ll ST_query_A_mx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[0][l][k],f[0][r-(1<<k)+1][k]);
}

ll ST_query_A_mn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[1][l][k],f[1][r-(1<<k)+1][k]);
}

ll ST_query_B_mn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[2][l][k],f[2][r-(1<<k)+1][k]);
}

ll ST_query_B_mx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[3][l][k],f[3][r-(1<<k)+1][k]);
}

ll ST_query_A_fmn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[4][l][k],f[4][r-(1<<k)+1][k]);
}

ll ST_query_A_fmx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[5][l][k],f[5][r-(1<<k)+1][k]);
}

void solve(){
	ST_prework();
	while(q--){
		read(l1),read(r1),read(l2),read(r2);
		ll amn=ST_query_A_mn(l1,r1),amx=ST_query_A_mx(l1,r1),
			bmn=ST_query_B_mn(l2,r2),bmx=ST_query_B_mx(l2,r2);
		if(amn<0){
			if(amx<0){
				if(bmn<0){
					if(bmx<0)	print(1ll*amn*bmx,'\n');
					else print(1ll*amx*bmx,'\n');
				}
				else print(1ll*amx*bmx,'\n');
			}
			else{
				if(bmn<0){
					if(bmx<0)	print(1ll*amn*bmx,'\n');
					else{
						ll res1=ST_query_A_fmx(l1,r1),res2=ST_query_A_fmn(l1,r1);
						print(max(1ll*res2*bmn,1ll*res1*bmx),'\n');
					}
				}
				else print(1ll*amx*bmn,'\n');
			}
		}
		else{
			if(bmn<0)	print(amn*bmn,'\n');
			else print(1ll*amx*bmn,'\n');
		}
	}
	return ;
}

int main(){
//	freopen("game.in","r",stdin);
// 	freopen("game.out","w",stdout);
	read(n),read(m),read(q);
	for(int i=1;i<=n;++i)	read(a[i]);
	for(int i=1;i<=m;++i)	read(b[i]);
	solve();
	return 0;
}

这份代码的 const int N=2e5+10; 改成 const int N=1e5+10; 为什么会出现 RE 的情况?

但是我分成部分分写开const int N=1e5+10;就没问题。这是什么原因?

这是部分分的代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
using namespace std;
using ll=long long ;

namespace IO{
template<typename Type>void read(Type &x){
	x=0;int fl=0;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')	fl=1;
		ch=getchar();
	}
	while(isdigit(ch))	x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	if(fl) x=-x;
}
template<typename Type>void print(Type x){
	if(x<0)	x=-x,putchar('-');
	if(x>9)	print(x/10);
	putchar((int)(x%10)+'0');
}
template<typename Type>void print(Type x,char ch){
	print(x),putchar(ch);
}
}using namespace IO;

const int N=1e5+10;
int n,m,q,a[N],b[N],log_2[N];
int l1,r1,l2,r2;

namespace bf{
std::vector<ll>c[1010];
ll f[1010][1010][11];

void ST_prework(){
	for(int i=2;i<=1010;++i)	log_2[i]=log_2[i/2]+1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			f[i][j][0]=c[i][j];
	for(int i=1;i<=n;++i)
		for(int k=1;k<=log_2[m];++k)
			for(int j=1;j+(1<<k)-1<=m;++j)
				f[i][j][k]=min(f[i][j][k-1],f[i][j+(1<<(k-1))][k-1]);
}

ll ST_query(int x,int l,int r){
	int k=log_2[r-l+1];
	return min(f[x][l][k],f[x][r-(1<<k)+1][k]);
}

void solve(){
	for(int i=1;i<=n;++i){
		c[i].push_back(0);
		for(int j=1;j<=m;++j)
			c[i].push_back(1ll*a[i]*b[j]);
	}
	ST_prework();
	ll ans=-1e18;
	while(q--){
		read(l1),read(r1),read(l2),read(r2),ans=-1e18;
		for(int i=l1;i<=r1;++i)	ans=max(ans,ST_query(i,l2,r2));
		print(ans,'\n');
	}
	return ;
}

}

ll f[6][N][30];

namespace Spl{
//max:小L min:小Q 
void ST_prework(){
	for(int i=2;i<=1e5;++i)	log_2[i]=log_2[i/2]+1;
	for(int i=1;i<=n;++i)	f[0][i][0]=a[i];
	for(int i=1;i<=m;++i)	f[1][i][0]=b[i];
	for(int k=1;k<=log_2[n];++k)
		for(int i=1;i<=n;++i)
			f[0][i][k]=max(f[0][i][k-1],f[0][i+(1<<(k-1))][k-1]);
	for(int k=1;k<=log_2[m];++k)
		for(int i=1;i<=m;++i)
			f[1][i][k]=min(f[1][i][k-1],f[1][i+(1<<(k-1))][k-1]);
}

ll ST_query_mx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[0][l][k],f[0][r-(1<<k)+1][k]);
}

ll ST_query_mn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[1][l][k],f[1][r-(1<<k)+1][k]);
}

void solve(){
	ST_prework();
	while(q--){
		read(l1),read(r1),read(l2),read(r2);
		print(ST_query_mx(l1,r1)*ST_query_mn(l2,r2),'\n');
	}
	return ;
}

}

namespace std{

void ST_prework(){
	for(int i=2;i<=1e5;++i)	log_2[i]=log_2[i/2]+1;
	for(int i=1;i<=n;++i)	f[0][i][0]=f[1][i][0]=a[i];
	for(int i=1;i<=m;++i)	f[2][i][0]=f[3][i][0]=b[i];
	for(int k=1;k<=log_2[n];++k)
		for(int i=1;i<=n;++i)
			f[0][i][k]=max(f[0][i][k-1],f[0][i+(1<<(k-1))][k-1]),
			f[1][i][k]=min(f[1][i][k-1],f[1][i+(1<<(k-1))][k-1]);
	for(int k=1;k<=log_2[m];++k)
		for(int i=1;i<=m;++i)
			f[2][i][k]=min(f[2][i][k-1],f[2][i+(1<<(k-1))][k-1]),
			f[3][i][k]=max(f[3][i][k-1],f[3][i+(1<<(k-1))][k-1]);
	for(int i=1;i<=n;++i){
		b[i]=a[i];
		if(a[i]<0)	a[i]=1e9;
		if(b[i]>0)	b[i]=-1e9;
	}
	for(int i=1;i<=n;++i)	f[4][i][0]=a[i],f[5][i][0]=b[i];
	for(int k=1;k<=log_2[n];++k)
		for(int i=1;i<=n;++i)
			f[4][i][k]=min(f[4][i][k-1],f[4][i+(1<<(k-1))][k-1]),
			f[5][i][k]=max(f[5][i][k-1],f[5][i+(1<<(k-1))][k-1]);
}

ll ST_query_A_mx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[0][l][k],f[0][r-(1<<k)+1][k]);
}

ll ST_query_A_mn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[1][l][k],f[1][r-(1<<k)+1][k]);
}

ll ST_query_B_mn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[2][l][k],f[2][r-(1<<k)+1][k]);
}

ll ST_query_B_mx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[3][l][k],f[3][r-(1<<k)+1][k]);
}

ll ST_query_A_fmn(int l,int r){
	int k=log_2[r-l+1];
	return min(f[4][l][k],f[4][r-(1<<k)+1][k]);
}

ll ST_query_A_fmx(int l,int r){
	int k=log_2[r-l+1];
	return max(f[5][l][k],f[5][r-(1<<k)+1][k]);
}

void solve(){
	ST_prework();
	while(q--){
		read(l1),read(r1),read(l2),read(r2);
		ll amn=ST_query_A_mn(l1,r1),amx=ST_query_A_mx(l1,r1),
			bmn=ST_query_B_mn(l2,r2),bmx=ST_query_B_mx(l2,r2);
		if(amn<0){
			if(amx<0){
				if(bmn<0){
					if(bmx<0)	print(1ll*amn*bmx,'\n');
					else print(1ll*amx*bmx,'\n');
				}
				else print(1ll*amx*bmx,'\n');
			}
			else{
				if(bmn<0){
					if(bmx<0)	print(1ll*amn*bmx,'\n');
					else{
						ll res1=ST_query_A_fmx(l1,r1),res2=ST_query_A_fmn(l1,r1);
						print(max(1ll*res2*bmn,1ll*res1*bmx),'\n');
					}
				}
				else print(1ll*amx*bmn,'\n');
			}
		}
		else{
			if(bmn<0)	print(amn*bmn,'\n');
			else print(1ll*amx*bmn,'\n');
		}
	}
	return ;
}

}

int main(){
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	read(n),read(m),read(q);
	bool flag=true;
	for(int i=1;i<=n;++i){
		read(a[i]);
		if(a[i]<0)	flag=false;
	}
	for(int i=1;i<=m;++i){
		read(b[i]);
		if(b[i]<0)	flag=false;
	}
	if(n<=1000&&m<=1000)	bf::solve();
	else if(flag)	Spl::solve();
	else	std::solve();
	return 0;
}
2024/11/23 16:55
加载中...