CCF,你是懂数据强度的
查看原帖
CCF,你是懂数据强度的
244395
_ReVeLuv楼主2022/11/21 22:53

两件事。

第一是这道题民间数据好歹还对了几个,官方数据直接挂完了。求调。

const int MAXN=1e6+5,MAXLG=35,INF=LLONG_MAX;
int n,m,q,a[MAXN],b[MAXN],lg[MAXN];
int APosMax[MAXN][MAXLG],APosMin[MAXN][MAXLG];
//Pos: >=0; Neg: <0
int ANegMax[MAXN][MAXLG],ANegMin[MAXN][MAXLG];
int BMax[MAXN][MAXLG],BMin[MAXN][MAXLG];
inline int APMax(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return max(APosMax[l][s],APosMax[p][s]);
}
inline int APMin(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return min(APosMin[l][s],APosMin[p][s]);
}
inline int ANMax(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return max(ANegMax[l][s],ANegMax[p][s]);
}
inline int ANMin(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return min(ANegMin[l][s],ANegMin[p][s]);
}
inline int BMMax(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return max(BMax[l][s],BMax[p][s]);
}
inline int BMMin(int l,int r){
	int s=lg[r-l+1]-1,p=r-(1<<s)+1;
	return min(BMin[l][s],BMin[p][s]);
}
inline void solve(int l1,int r1,int l2,int r2){
	int aposmax=APMax(l1,r1),aposmin=APMin(l1,r1);
	int anegmax=ANMax(l1,r1),anegmin=ANMin(l1,r1);
	int bmax=BMMax(l2,r2),bmin=BMMin(l2,r2);
//	write(aposmax),putchar(' '),write(aposmin),puts("");
//	write(anegmax),putchar(' '),write(anegmin),puts("");
//	write(bmax),putchar(' '),write(bmin),puts("");
	int ans=-INF;
	if(aposmax==-INF||aposmin==INF){
		//non pos
		ans=bmax*anegmax;
	}
	else if(anegmax==-INF||aposmax==INF){
		//non neg
		ans=bmin*aposmin;
	}
	else{
		if(bmax>=0&&bmin<0) ans=max(anegmax*bmax,aposmin*bmin);
		else if(bmax>=0&&bmin>=0) ans=aposmax*bmin;
		else{
			//bmax<0&&bmin<0
			ans=anegmin*bmax;
		}
	}
	write(ans),puts("");
}
signed main()
{
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++) b[i]=read();
	for(int i=1;i<=MAXN-5;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	for(int i=1;i<=n;i++){
		APosMax[i][0]=(a[i]>=0)?a[i]:-INF;
		APosMin[i][0]=(a[i]>=0)?a[i]:INF;
		ANegMax[i][0]=(a[i]<0)?a[i]:-INF;
		ANegMin[i][0]=(a[i]<0)?a[i]:INF;
	}
	for(int i=1;i<=m;i++){
		BMax[i][0]=b[i],BMin[i][0]=b[i];
	}
	for(int j=1;j<=lg[n]+3;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			int p=i+(1<<(j-1));
			APosMax[i][j]=max(APosMax[i][j-1],APosMax[p][j-1]);
			APosMin[i][j]=min(APosMin[i][j-1],APosMin[p][j-1]);
			ANegMax[i][j]=max(ANegMax[i][j-1],ANegMax[p][j-1]);
			ANegMin[i][j]=min(ANegMin[i][j-1],ANegMin[p][j-1]);
		}
	}
	for(int j=1;j<=lg[m]+3;j++){
		for(int i=1;i+(1<<j)-1<=m;i++){
			int p=i+(1<<(j-1));
			BMax[i][j]=max(BMax[i][j-1],BMax[p][j-1]);
			BMin[i][j]=min(BMin[i][j-1],BMin[p][j-1]);
		}
	}
	for(int i=1;i<=q;i++){
		int x=read(),y=read(),z=read(),w=read();
		solve(x,y,z,w);
	}
}

另外一件事是捞贴。

如果需要还有路径压缩。

2022/11/21 22:53
加载中...