关于CSP-S T2 洛谷60 别的平台也是60 但官方给的数据是0
  • 板块学术版
  • 楼主BlueSu
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/11/8 19:28
  • 上次更新2023/10/27 03:43:41
查看原帖
关于CSP-S T2 洛谷60 别的平台也是60 但官方给的数据是0
232887
BlueSu楼主2022/11/8 19:28

RT,不知道为什么爆零了,有没有选手和我的情况一样,能帮我看看代码

是一个n方的ST表()

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<climits>
#include<cstring>
using namespace std;
#define LEN 5005
#define ll long long
#define for1(i,n) for(int i=1;i<=n;i++)
int n,m,qp;
long long a[LEN],b[LEN],c[LEN][LEN];
long long stmaxb[LEN][LEN],stminb[LEN][LEN],stmaxa[LEN][LEN],stmina[LEN][LEN];
ll read(){
	ll f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return f*x;
}
void write(ll x){
	if(x<0){putchar('-');x=-x;}
	if(x>=10){write(x/10);}
	putchar(x%10+'0');
}
void init1(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			c[i][j]=a[i]*b[j];
		}
	}
}
void init2(){
	for(int i=1;i<=n;i++){
		stmaxa[i][1]=stmina[i][1]=a[i];
	}
	for(int j=2;j<=n;j++){
		for(int i=1;i<=n-j+1;i++){
			stmaxa[i][j]=max(stmaxa[i][j-1],a[i+j-1]);
			stmina[i][j]=min(stmina[i][j-1],a[i+j-1]);
		}
	}
	for(int i=1;i<=m;i++){
		stminb[i][1]=stmaxb[i][1]=b[i];
	}
	for(int j=2;j<=m;j++){
		for(int i=1;i<=m-j+1;i++){
			stmaxb[i][j]=max(stmaxb[i][j-1],b[i+j-1]);
			stminb[i][j]=min(stminb[i][j-1],b[i+j-1]);
		}
	}
}
void work(ll l1,ll r1,ll l2,ll r2){
	ll ans=LLONG_MIN;
	for(int j=l1;j<=r1;j++){
		ll minn=LLONG_MAX;
		for(int k=l2;k<=r2;k++){
			minn=min(minn,c[j][k]);
		}
		ans=max(ans,minn);
	}
	//printf("%lld\n",ans);
	write(ans);
}
int main(){
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	n=read(),m=read(),qp=read();
	bool fag=true;
	for(int i=1;i<=n;i++){
		a[i]=read();
		if(a[i]<=0){fag=false;}
	}
	for(int i=1;i<=m;i++){
		b[i]=read();
		if(b[i]<=0){fag=false;}
	}
	if(!fag&&n<=1500&&m<=1500&&qp<=1500){init1();}
	else{init2();}
	init2();
	
	for(int i=1;i<=qp;i++){
		ll p,q,r,s;
		p=read(),q=read(),r=read(),s=read();
		// Special 2
		if(p==q){
			ll tmp1=stmaxb[r][s-r+1]*a[p],tmp2=stminb[r][s-r+1]*a[p];
			write(min(tmp1,tmp2));
			putchar('\n');
			continue;
		}
		if(r==s){
			ll tmp1=stmaxa[p][q-p+1]*b[r],tmp2=stmina[p][q-p+1]*b[r];
			write(max(tmp1,tmp2));
			putchar('\n');
			continue;
		}
		// Special 1
		if(fag){
			ll u=stmaxa[p][q-p+1],v=stminb[r][s-r+1];
			write(u*v);
			putchar('\n');
			continue;
		}
		// Small cases
		work(p,q,r,s);
		putchar('\n');
	}
	return 0;
}
2022/11/8 19:28
加载中...