65分特殊样例过了,求调qwq
查看原帖
65分特殊样例过了,求调qwq
372172
Q__A__Q楼主2022/11/12 22:40

参考思路

// Problem: P8818 [CSP-S 2022] 策略游戏
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P8818
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// Date: 2022-11-10 11:14:20
// Author: fzy
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int ll

const int maxn=1e5+10;
const int inf=1e12;
int n,m,t,ans;
int sta[maxn][31][2],stb[maxn][31][2],st[maxn][31][3],a[maxn],b[maxn]; //st 0max 1min st:0最小非负 1最大非正
bool flag1=1,flag2=1; //flag1全部>0 flag2全部<0

inline int read() {
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if(ch=='-')w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}

inline void write(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+'0');
}

inline void rmqa() {
	for(int i=1;i<=n;++i)
		sta[i][0][0]=sta[i][0][1]=a[i];
	for(int i=1;(1<<i)<=n;++i)
		for(int j=1;j+(1<<i)-1<=n;++j) {
			sta[j][i][0]=max(sta[j][i-1][0],sta[j+(1<<(i-1))][i-1][0]);
			sta[j][i][1]=min(sta[j][i-1][1],sta[j+(1<<(i-1))][i-1][1]);
		}
}

inline void rmq() {
	for(int i=1;i<=n;++i)
		st[i][0][0]=a[i]>=0?a[i]:inf;
	for(int i=1;(1<<i)<=n;++i)
		for(int j=1;j+(1<<i)-1<=n;++j) 
			st[j][i][0]=min(st[j][i-1][0],st[j+(1<<(i-1))][i-1][0]);
	for(int i=1;i<=n;++i)
		st[i][0][1]=a[i]<0?a[i]:-inf;
	for(int i=1;(1<<i)<=n;++i)
		for(int j=1;j+(1<<i)-1<=n;++j) 
			st[j][i][1]=max(st[j][i-1][1],st[j+(1<<(i-1))][i-1][1]);
}

inline int query(int x,int y,int tmp) {
	int k=(int)(log(y-x+1)/log(2));
	if(tmp==0) return min(st[x][k][0],st[y-(1<<k)+1][k][0]);
	else return max(st[x][k][1],st[y-(1<<k)+1][k][1]);
}

inline void rmqb() {
	for(int i=1;i<=m;++i)
		stb[i][0][0]=stb[i][0][1]=b[i];
	for(int i=1;(1<<i)<=m;++i)
		for(int j=1;j+(1<<i)-1<=m;++j) {
			stb[j][i][0]=max(stb[j][i-1][0],stb[j+(1<<(i-1))][i-1][0]);
			stb[j][i][1]=min(stb[j][i-1][1],stb[j+(1<<(i-1))][i-1][1]);
		}
}

inline int querya(int l,int r,int tmp) {
	int k=(int)(log(r-l+1)/log(2));
	if(tmp==0) return max(sta[l][k][0],sta[r-(1<<k)+1][k][0]);
	else return min(sta[l][k][1],sta[r-(1<<k)+1][k][1]);
}

inline int queryb(int l,int r,int tmp) {
	int k=(int)(log(r-l+1)/log(2));
	if(tmp==0) return max(stb[l][k][0],stb[r-(1<<k)+1][k][0]);
	else return min(stb[l][k][1],stb[r-(1<<k)+1][k][1]);
}

signed main() {
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    n=read(),m=read(),t=read();
    for(int i=1;i<=n;++i) {
    	a[i]=read();
    	if(a[i]<0) flag1=false;
    	if(a[i]>0) flag2=false;
    }
    for(int i=1;i<=m;++i) {
    	b[i]=read();
    	if(b[i]<0) flag1=false;
    	if(b[i]>0) flag2=false;
    }
    if(flag2) { //a b <0
    	for(int i=1;i<=n;++i) a[i]=-a[i];
    	for(int i=1;i<=m;++i) b[i]=-b[i];
    }
    rmq(),rmqa(),rmqb();
    // cout<<query(1,5,0)<<endl;
    while(t--) {
    	int l1=read(),r1=read(),l2=read(),r2=read();
    	if(flag1||flag2) {
    		write(querya(l1,r1,0)*queryb(l2,r2,1)),puts("");
    		continue;
    	}
    	if(l1==r1) {
    		if(a[l1]==0) puts("0");
    		else if(a[l1]>0) {
    			write(queryb(l2,r2,1)*a[l1]),puts("");
    		}
    		else write(queryb(l2,r2,0)*a[l1]),puts("");
    	}
    	else if(l2==r2) {
    		if(b[l2]==0) puts("0");
    		else if(b[l2]>0) {
    			write(querya(l1,r1,0)*b[l2]),puts("");
    		}
    		else write(querya(l1,r1,1)*b[l2]),puts("");
    	}
    	else {
    		// puts("yes");
    		// cout<<query(l1,r1,0)<<' '<<queryb(l2,r2,1)<<' '<<query(l1,r1,1)<<' '<<queryb(l2,r2,0)<<endl;
    		ans=-inf;
    		int amax=querya(l1,r1,0),amin=querya(l1,r1,1),azmax=query(l1,r1,0),afmin=query(l1,r1,1),bmax=queryb(l2,r2,0),bmin=queryb(l2,r2,1);
    		//ans=max(max(ans,querya(l1,r1,1)*queryb(l2,r2,0)),max(querya(l1,r1,0)*queryb(l2,r2,1),max(query(l1,r1,0)*queryb(l2,r2,1),query(l1,r1,1)*queryb(l2,r2,0))));
			if(amax>=0) ans=max(ans,amax*bmin);
			else ans=max(ans,amax*bmax);
			if(amin>=0) ans=max(ans,amin*bmin);
			else ans=max(ans,amin*bmax);
			if(azmax!=inf) ans=max(ans,azmax*bmin);
			if(afmin!=inf) ans=max(ans,afmin*bmax);
    		write(ans),puts("");
    	}
    }
    /*
    x>0 y最小
    x<0 y最大
    
    x>0 y>=0 :x最大 y最小
    	y<0 :x最小且大于0 y最小
    x<0 y>=0 :x最大且小于0 y最大
    	y<0 :x最小 y最大
    */
    return 0;
}
2022/11/12 22:40
加载中...