社区讨论

ST代码60求调

P8818[CSP-S 2022] 策略游戏参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjd22sf
此快照首次捕获于
2025/11/04 00:34
4 个月前
此快照最后确认于
2025/11/04 00:34
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const long long maxinf = LONG_LONG_MAX, mininf = LONG_LONG_MIN;
inline int read() {
    int x = 0;
    bool f = true;
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar())
        if (ch == '-')
            f = false;
    for (; isdigit(ch); ch = getchar())
        x = (x << 1) + (x << 3) + ch - '0';
    return f ? x : (~(x - 1));
}
long long n,m,q,x,l1,r1,l2,r2,x1[100005][10],x2[100005][10],y[100005][10],y2[100005][10],xa1[100005][10],xa2[100005][10];
inline bool gmx(long long &aa,long long bb){
	if(bb>aa){
		aa=bb;
		return true;
	}
	return false;
}
int main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++){
		x=read();
		x1[i][0]=x2[i][0]=x;
		if(x<0){
			xa1[i][0]=x;
			xa2[i][0]=maxinf;
		}else{
			xa2[i][0]=x;
			xa1[i][0]=mininf;
		}
	}
	for(int j=1;j<=m;j++){
		x=read();
		y[j][0]=y2[j][0]=x;
	}
	long long t1=log(n)/log(2)+1,t2=log(m)/log(2)+1;
	for(int j=1;j<=t1;++j){		
		for(int i=1;i<=n-(1<<j)+1;++i){	
			x1[i][j]=max(x1[i][j-1],x1[i+(1<<(j-1))][j-1]);
			x2[i][j]=min(x2[i][j-1],x2[i+(1<<(j-1))][j-1]);
			xa1[i][j]=max(xa1[i][j-1],xa1[i+(1<<(j-1))][j-1]);
			xa2[i][j]=min(xa2[i][j-1],xa2[i+(1<<(j-1))][j-1]);
		}	
	}		
	for(int j=1;j<=t2;++j){		
		for(int i=1;i<=m-(1<<j)+1;++i){	
			y[i][j]=max(y[i][j-1],y[i+(1<<(j-1))][j-1]);
			y2[i][j]=min(y2[i][j-1],y2[i+(1<<(j-1))][j-1]);
		}	
	}
	while(q--){
		l1=read(),r1=read(),l2=read(),r2=read();
		long long k1=log(r1-l1+1)/log(2),k2=log(r2-l2+1)/log(2);		
		long long a1=max(x1[l1][k1],x1[r1-(1<<k1)+1][k1]),a2=min(x2[l1][k1],x2[r1-(1<<k1)+1][k1]);
		long long b1=max(y[l2][k2],y[r2-(1<<k2)+1][k2]),b2=min(y2[l2][k2],y2[r2-(1<<k2)+1][k2]);
		long long aa1=max(xa1[l1][k1],xa1[r1-(1<<k1)+1][k1]),aa2=min(xa2[l1][k1],xa2[r1-(1<<k1)+1][k1]);
		long long ans=mininf;
		gmx(ans, a1 * (a1 >= 0 ? b2 : b1));
        gmx(ans, a2 * (a2 >= 0 ? b2 : b1));
        if (aa1 != mininf) gmx(ans, aa1 * (aa1 >= 0 ? b2 : b1));
        if (aa2 !=maxinf) gmx(ans, aa2 * (aa2 >= 0 ? b2 : b1));
		cout << ans << endl;
	}
	return 0;
}


回复

1 条回复,欢迎继续交流。

正在加载回复...