40pts求条,马蜂应该挺好吧
查看原帖
40pts求条,马蜂应该挺好吧
1412149
Dog_77楼主2025/8/1 08:48
#include<bits/stdc++.h>
#define itn int
#define ll long long
#define ld long double
#define str string
#define enld endl
#define endl '\n'
#define pii pair<int,int>
#define s_int set<int>::iterator
#define ms_int multiset<int>::iterator
#define s_ll set<long long>::iterator
#define ms_ll multiset<long long>::iterator
#define mp_int map<str,int>::iterator
#define pb push_back
const int N = 1e5+5;
using namespace std;
inline ll read(){
	ll 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;
}
ll n,m,q,lg[N],sum[N],sum1[N];
ll st[N][25][7],st1[N][25][7];
ll qmax(ll l,ll r,ll num){
	ll k=r-l+1;
	return max(st[l][lg[k]][num],st[r-(1<<lg[k])+1][lg[k]][num]);
}
ll qmin(ll l,ll r,ll num){
	ll k=r-l+1;
	return min(st[l][lg[k]][num],st[r-(1<<lg[k])+1][lg[k]][num]);
}
ll qmax1(ll l,ll r,ll num){
	ll k=r-l+1;
	return max(st1[l][lg[k]][num],st1[r-(1<<lg[k])+1][lg[k]][num]);
}
ll qmin1(ll l,ll r,ll num){
	ll k=r-l+1;
	return min(st1[l][lg[k]][num],st1[r-(1<<lg[k])+1][lg[k]][num]);
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	n=read();
	m=read();
	q=read();
	lg[0]=-1;
	for(ll i=1;i<=n;i++) st[i][0][1]=0-1e9-50,st[i][0][3]=0-1e9-50;
	for(ll i=1;i<=n;i++) st[i][0][2]=1e9+50,st[i][0][4]=1e9+50;
	for(ll i=1;i<=n;i++) st1[i][0][1]=0-1e9-50,st1[i][0][3]=0-1e9-50;
	for(ll i=1;i<=n;i++) st1[i][0][2]=1e9+50,st1[i][0][4]=1e9+50;
	for(ll i=1;i<=n;i++){
		ll x=read();
		if(x>=0) st[i][0][1]=st[i][0][3]=x;
		else st[i][0][2]=st[i][0][4]=x,sum[i]++;
	}
	for(ll i=1;i<=m;i++){
		ll x;x=read();
		if(x>=0) st1[i][0][1]=st1[i][0][3]=x;
		else st1[i][0][2]=st1[i][0][4]=x,sum1[i]++;
	}
	for(ll i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(ll j=1;j<=lg[n];j++){
		for(ll i=1;i+(1<<j-1)<=n;i++){
//			if(st[i][j-1][1]>=0&&st[i+(1<<j-1)][j-1][1]>=0) 
			st[i][j][1]=max(st[i][j-1][1],st[i+(1<<j-1)][j-1][1]);
//			if(st[i][j-1][2]<0&&st[i+(1<<j-1)][j-1][2]<0) 
			st[i][j][2]=max(st[i][j-1][2],st[i+(1<<j-1)][j-1][2]);
//			if(st[i][j-1][3]>=0&&st[i+(1<<j-1)][j-1][3]>=0) 
			st[i][j][3]=min(st[i][j-1][3],st[i+(1<<j-1)][j-1][3]);
//			if(st[i][j-1][4]<0&&st[i+(1<<j-1)][j-1][4]<0) 
			st[i][j][4]=min(st[i][j-1][4],st[i+(1<<j-1)][j-1][4]);
//			if(st1[i][j-1][1]>=0&&st1[i+(1<<j-1)][j-1][1]>=0) 
			st1[i][j][1]=max(st1[i][j-1][1],st1[i+(1<<j-1)][j-1][1]);
//			if(st1[i][j-1][2]<0&&st1[i+(1<<j-1)][j-1][2]<0) 
			st1[i][j][2]=max(st1[i][j-1][2],st1[i+(1<<j-1)][j-1][2]);
//			if(st1[i][j-1][3]>=0&&st1[i+(1<<j-1)][j-1][3]>=0) 
			st1[i][j][3]=min(st1[i][j-1][3],st1[i+(1<<j-1)][j-1][3]);
//			if(st1[i][j-1][4]<0&&st1[i+(1<<j-1)][j-1][4]<0) 
			st1[i][j][4]=min(st1[i][j-1][4],st1[i+(1<<j-1)][j-1][4]);
		}
	}
	for(ll i=1;i<=q;i++){
		ll x,y,xx,yy;
		x=read(),y=read();
		xx=read(),yy=read();
		if(sum[y]-sum[x-1]>0){
			if(sum[y]-sum[x-1]<y-x){
				if(sum1[yy]-sum1[xx-1]>0){
					if(sum1[yy]-sum1[xx-1]<y-x){
						cout <<max(qmin(x,y,3)*qmin1(xx,yy,4),qmax(x,y,2)*qmax1(xx,yy,1)) <<endl;
					}
					else{
						cout <<qmin(x,y,4)*qmax1(xx,yy,2) <<endl;
					}
				}
				else{
					cout <<qmax(x,y,1)*qmin1(xx,yy,3) <<endl;
				}
			}
			else{
				if(sum1[yy]-sum1[xx-1]>0){
					if(sum1[yy]-sum1[xx-1]<y-x){
						cout <<qmin(x,y,2)*qmin1(xx,yy,4) <<endl;
					}
					else{
						cout <<qmin(x,y,4)*qmax1(xx,yy,2) <<endl;
					}
				}
				else{
					cout <<qmax(x,y,2)*qmin1(xx,yy,3) <<endl;
				}
			}
		}
		else{
			if(sum1[yy]-sum1[xx-1]>0){
				if(sum1[yy]-sum1[xx-1]<y-x){
					cout <<max(qmin(x,y,3)*qmin1(xx,yy,4),qmax(x,y,2)*qmax1(xx,yy,1)) <<endl;
				}
				else{
					cout <<qmin(x,y,3)*qmax1(xx,yy,2) <<endl;
				}
			}
			else{
				cout <<qmax(x,y,1)*qmin1(xx,yy,3) <<endl;
			}
		}
	}
	return 0;
}

2025/8/1 08:48
加载中...