求助提高 T2
  • 板块学术版
  • 楼主Unnamed114514
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/10/29 23:35
  • 上次更新2023/10/27 04:59:35
查看原帖
求助提高 T2
556362
Unnamed114514楼主2022/10/29 23:35

RT,写的 RMQ,自我感觉应该是正解,但考场大样例第 44 个没过,洛谷 WA60,本地和暴力拍了 10610^6 组都没有问题。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
int n,m,q,a[maxn],b[maxn],Log[maxn],dp[2][maxn][15][4];
inline int read(){
	int res=0,f=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		f|=(ch=='-');
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=getchar();
	} 
	return f?-res:res;
}
inline int Qmax(int p1,int l,int r,int p2){
	int k=Log[r-l+1];
	return max(dp[p1][l][k][p2],dp[p1][r-(1<<k)+1][k][p2]);
}
inline int Qmin(int p1,int l,int r,int p2){
	int k=Log[r-l+1];
	return min(dp[p1][l][k][p2],dp[p1][r-(1<<k)+1][k][p2]);
}
signed main(){
// 	freopen("game.in","r",stdin);
// 	freopen("game.out","w",stdout);
	n=read(),m=read(),q=read();
	for(int i=2;i<=max(n,m);++i)
		Log[i]=Log[i>>1]+1;
	for(int i=1;i<=max(n,m);++i)
		dp[0][i][0][0]=dp[1][i][0][0]=dp[0][i][0][2]=dp[1][i][0][2]=-2e9,dp[0][i][0][1]=dp[1][i][0][1]=dp[0][i][0][3]=dp[1][i][0][3]=2e9;
	for(int i=1;i<=n;++i){
		a[i]=read();
		if(a[i]<=0)
			dp[0][i][0][2]=dp[0][i][0][3]=a[i];
		else
			dp[0][i][0][0]=dp[0][i][0][1]=a[i]; 
	}
	for(int i=1;i<=m;++i){
		b[i]=read();
		if(b[i]<=0)
			dp[1][i][0][2]=dp[1][i][0][3]=b[i];
		else
			dp[1][i][0][0]=dp[1][i][0][1]=b[i];
	}
	for(int j=1;(1<<j)<=n;++j){
		for(int i=1;i+(1<<j)-1<=n;++i){
			dp[0][i][j][0]=max(dp[0][i][j-1][0],dp[0][i+(1<<j-1)][j-1][0]);
			dp[0][i][j][1]=min(dp[0][i][j-1][1],dp[0][i+(1<<j-1)][j-1][1]);
			dp[0][i][j][2]=max(dp[0][i][j-1][2],dp[0][i+(1<<j-1)][j-1][2]);
			dp[0][i][j][3]=min(dp[0][i][j-1][3],dp[0][i+(1<<j-1)][j-1][3]);
		}
		for(int i=1;i+(1<<j)-1<=m;++i){
			dp[1][i][j][0]=max(dp[1][i][j-1][0],dp[1][i+(1<<j-1)][j-1][0]);
			dp[1][i][j][1]=min(dp[1][i][j-1][1],dp[1][i+(1<<j-1)][j-1][1]);
			dp[1][i][j][2]=max(dp[1][i][j-1][2],dp[1][i+(1<<j-1)][j-1][2]);
			dp[1][i][j][3]=min(dp[1][i][j-1][3],dp[1][i+(1<<j-1)][j-1][3]);
		}
	}
	while(q--){
		int l1=read(),r1=read(),l2=read(),r2=read();
		if(Qmax(0,l1,r1,2)==-2e9){
			if(Qmax(1,l2,r2,2)==-2e9)
				printf("%lld\n",Qmax(0,l1,r1,0)*Qmin(1,l2,r2,1));
			else
				printf("%lld\n",Qmin(0,l1,r1,1)*Qmin(1,l2,r2,3));
		} else if(Qmax(0,l1,r1,0)==-2e9){
			if(Qmax(1,l2,r2,0)==-2e9)
				printf("%lld\n",Qmin(0,l1,r1,3)*Qmax(1,l2,r2,2));
			else
				printf("%lld\n",Qmax(0,l1,r1,2)*Qmax(1,l2,r2,0));
		} else{
			if(Qmax(1,l2,r2,0)==-2e9)
				printf("%lld\n",Qmin(0,l1,r1,3)*Qmax(1,l2,r2,2));
			else if(Qmax(1,l2,r2,2)==-2e9)
				printf("%lld\n",Qmax(0,l1,r1,0)*Qmin(1,l2,r2,1));
			else
				printf("%lld\n",max(Qmax(0,l1,r1,2)*Qmax(1,l2,r2,0),Qmin(0,l1,r1,1)*Qmin(1,l2,r2,3)));
		} 
	}
	return 0;
}
2022/10/29 23:35
加载中...