关于提高第二题
  • 板块学术版
  • 楼主Rain_Carnation
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/10/30 09:46
  • 上次更新2023/10/27 04:57:00
查看原帖
关于提高第二题
720455
Rain_Carnation楼主2022/10/30 09:46
//T2
/*
3 2 2
0 1 2
3 4
1 3 1 2
2 3 2 2
*/
/*
0 0
3 4
6 8
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
int n,m;
const int N=303,M=100003;
ll f[N][20][N];
int f1[20][M],f2[20][M];
int a[M],b[M];
ll c[N][N];
void init(int k){
	for(int i=1;i<=m;++i) f[k][0][i]=c[k][i];
	for(int j=1;(1<<j)<=m;++j)
		for(int i=1;i<=m;++i) f[k][j][i]=min(f[k][j-1][i],f[k][j-1][i+(1<<j-1)]);
}
ll query(int k,int l,int r){
	int mx=log2(r-l+1);
	return min(f[k][mx][l],f[k][mx][r-(1<<mx)+1]);
}
void init1(){
	for(int i=1;i<=n;++i) f1[0][i]=a[i];
	for(int j=1;(1<<j)<=n;++j)
		for(int i=1;i<=n;++i) f1[j][i]=max(f1[j-1][i],f1[j-1][i+(1<<j-1)]);
}
void init2(){
	for(int i=1;i<=n;++i) f2[0][i]=b[i];
	for(int j=1;(1<<j)<=n;++j)
		for(int i=1;i<=n;++i) f2[j][i]=min(f2[j-1][i],f2[j-1][i+(1<<j-1)]);
}
int query1(int l,int r){
	int mx=log2(r-l+1);
	return max(f1[mx][l],f1[mx][r-(1<<mx)+1]);
}
int query2(int l,int r){
	int mx=log2(r-l+1);
	return min(f2[mx][l],f2[mx][r-(1<<mx)+1]);
}
signed main(){
// 	freopen("game.in","r",stdin);
// 	freopen("game.out","w",stdout);
	int q; cin>>n>>m>>q;
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=m;++i) scanf("%d",&b[i]);
	if(n<=300 && m<=300 && q<=1010){
		for(int i=1;i<=n;++i) 
			for(int j=1;j<=m;++j) c[i][j]=a[i]*b[j];
		for(int i=1;i<=n;++i) init(i);
		while(q--){
			int l1,r1,l2,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			long long ans=-1e18; ans-=10;
			for(int i=l1;i<=r1;++i) ans=max(ans,query(i,l2,r2));
			printf("%lld\n",ans);
		}
		return 0;	
	}
//	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
//	for(int i=1;i<=m;++i) scanf("%lld",&b[i]);
//	for(int i=1;i<=n;++i) 
//		for(int j=1;j<=m;++j) c[i][j]=a[i]*b[j];
//	for(int i=1;i<=n;++i) init(i);
//	while(q--){
//		int l1,r1,l2,r2; scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
//		long long ans=-1e18-10;
//		for(int i=l1;i<=r1;++i) ans=max(ans,query(i,l2,r2));
//		printf("%lld\n",ans);
//	}
	init1(); init2();
	while(q--){
		int l1,l2,r1,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(l1==r1 && n<=1000 && m<=1000){
			ll ans=1e18; ans+=10;
			for(int i=l2;i<=r2;++i) ans=min((ll)a[l1]*b[i],ans);
			printf("%lld\n",ans); 
			continue;
		}
		if(l2==r2 && n<=1000 && m<=1000){
			ll ans=-1e18; ans-=10;
			for(int i=l1;i<=r1;++i) ans=max((ll)a[i]*b[l2],ans);
			printf("%lld\n",ans);
			continue;
		}
		ll ans=query1(l1,r1)*query2(l2,r2);
		printf("%lld\n",ans);
	}
	return 0;
}

这份代码已经送我退役了,谁能看看改过的这份代码为什么0分。

写了好几个 st 表。

2022/10/30 09:46
加载中...