65pts求调,ST表
查看原帖
65pts求调,ST表
529458
Butterfly___qwq楼主2023/10/19 16:23
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
struct ST_MIN{
	int st[18][100001]={{0}},p2[100001]={0};
	void init(int n,int a[]) {
		p2[0]=1;
		for(int i=1; i<=n; i++)st[0][i]=a[i],p2[i]=p2[i-1]*2;
		for(int i=1; i<=17; i++) {
			for(int j=1; j+p2[i]-1<=n; j++) {
				st[i][j]=min(st[i-1][j],st[i-1][j+p2[i-1]]);
			}
		}
	}
	int query(int l,int r) {
		int ll=log2(r-l+1);
		return min(st[ll][l],st[ll][r-p2[ll]+1]);
	}
};
struct ST_MAX{
	int st[18][100001]={{0}},p2[100001]={0};
	void init(int n,int a[]) {
		p2[0]=1;
		for(int i=1; i<=n; i++)st[0][i]=a[i],p2[i]=p2[i-1]*2;
		for(int i=1; i<=17; i++) {
			for(int j=1; j+p2[i]-1<=n; j++) {
				st[i][j]=max(st[i-1][j],st[i-1][j+p2[i-1]]);
			}
		}
	}
	int query(int l,int r) {
		int ll=log2(r-l+1);
		return max(st[ll][l],st[ll][r-p2[ll]+1]);
	}
};
int a[100001],b[100001],c[100001],d[100001],c1[100001],d1[100001];
ST_MAX s1,s3,s7,s6;
ST_MIN s2,s4,s5,s8;
signed main() {
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)a[i]=read(),c[i]=a[i]>=0?a[i]:-2e9,c1[i]=a[i]<=0?a[i]:2e9;
	for(int i=1;i<=m;i++)b[i]=read(),d[i]=b[i]>=0?b[i]:-2e9,d1[i]=b[i]<=0?b[i]:2e9;
	s1.init(n,a);
	s3.init(m,b);
	s2.init(n,a);
	s4.init(m,b);
	s5.init(n,c);
	s6.init(m,c1);
	s7.init(n,d);
	s8.init(m,d1);
	while(q--){
		int l1,r1,l2,r2;
		l1=read(),r1=read(),l2=read(),r2=read();
		int mn1=s2.query(l1,r1),mn2=s4.query(l2,r2),mx1=s1.query(l1,r1),mx2=s3.query(l2,r2);
		if(mn1>=0&&mn2>=0)cout<<mx1*mn2<<endl;//a>0,b>0
		else if(mn1>=0&&mn2<=0&&mx2>=0)cout<<mn1*mn2<<endl;//a>0,b<>0
		else if(mn1>=0&&mx2<=0)cout<<mn1*mn2<<endl;// a>0,b<0
		else if(mx1<=0&&mx2>=0&&mn2<=0)cout<<mx1*mx2<<endl;// a<0,b<>0
		else if(mx1<=0&&mx2<=0)cout<<mn1*mx2<<endl;// a<0,b<0
		else if(mx1<=0&&mn2>=0)cout<<mx1*mx2<<endl;// a<0,b>0
		else if(mn1<=0&&mx1>=0&&mn2>=0)cout<<mx1*mn2<<endl;// a<>0,b>0
		else if(mn1<=0&&mx1>=0&&mn2<=0&&mx2>=0)cout<<max(s6.query(l1,r1)*s7.query(l2,r2),s5.query(l1,r1)*s8.query(l2,r2))<<endl;// a<>0,b<>0
		else if(mn1<=0&&mx1>=0&&mx2<=0)cout<<mn1*mx2<<endl;// a<>0,b<0
	}
}
2023/10/19 16:23
加载中...