InfOJ AC 洛谷CE on C++14
查看原帖
InfOJ AC 洛谷CE on C++14
307940
aaaaaaaawsl楼主2022/11/3 14:40

N 开到 1000 能过60的点,在InfOJ上 C++14 10000正常跑,并且空间在10000Kb 以内。

用C++ 98 后在洛谷AC。

以尝试过define int long long 并且把重定义的max,min删去。

下面是CE代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

#define max(a,b) ((a)>(b)?(a):(b));
#define min(a,b) ((a)<(b)?(a):(b));

using namespace std;

inline int read(){
	register int x = 0, f = 1; register char ch = getchar();
	for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') f = -1;
	for(; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ '0');
	return x * f;  
}

const int N = 1e5 + 10;
int n, m, T;  
long long mxza, mxfa, mifa, miza;
long long mxb, mib;
long long ans;

struct node{
	int mxz = -1, miz = 2e9, mxf = -2e9, mif = 1;
}ta[N << 2];

struct Node{
	int mx = -2e9, mi = 2e9;
}tb[N << 2];

void pushupa(int now){
	int ls = (now << 1);
	int rs = (now << 1) | 1;
	ta[now].mxz = max(ta[ls].mxz,ta[rs].mxz);
	ta[now].miz = min(ta[ls].miz,ta[rs].miz);
	ta[now].mxf = max(ta[ls].mxf,ta[rs].mxf);
	ta[now].mif = min(ta[ls].mif,ta[rs].mif);
}

void inserta(int val, int now, int l, int L, int R){
	if(L == R){
		if(val >= 0) ta[now].mxz = ta[now].miz = val;
		else ta[now].mif = ta[now].mxf = val;
		return;
	} 
	int mid = (L + R) >> 1;
	if(mid >= l) inserta(val, now << 1, l, L, mid);
	else inserta(val, (now << 1) | 1, l, mid + 1, R);
	pushupa(now); 
}

inline void pushupb(int now){
	int ls = (now << 1);
	int rs = (now << 1) | 1;
	tb[now].mx = max(tb[ls].mx,tb[rs].mx);
	tb[now].mi = min(tb[ls].mi,tb[rs].mi);
}

void insertb(int val, int now, int l, int L, int R){
	if(L == R){
		tb[now].mx = tb[now].mi = val;
		return;
	} 
	int mid = (L + R) >> 1;
	if(mid >= l) insertb(val, now << 1, l, L, mid);
	else insertb(val, (now << 1) | 1, l, mid + 1, R);
	pushupb(now); 
}

void querya(int now, int l, int r, int L, int R){
	if(l >= L && r <= R){
		mxza = max(mxza,ta[now].mxz);
		mxfa = max(mxfa,ta[now].mxf);
		miza = min(miza,ta[now].miz);
		mifa = min(mifa,ta[now].mif);
		return;
	}
	int mid = (l + r) >> 1;
	if(mid >= L) querya(now << 1, l, mid, L, R);
	if(mid < R) querya((now << 1) | 1, mid + 1, r, L, R); 
}

void queryb(int now, int l, int r, int L, int R){
	if(l >= L && r <= R){
		mxb = max(mxb,tb[now].mx);
		mib = min(mib,tb[now].mi);
		return;
	}
	int mid = (l + r) >> 1;
	if(mid >= L) queryb(now << 1, l, mid, L, R);
	if(mid < R) queryb((now << 1) | 1, mid + 1, r, L, R); 
}

int main(){
	n = read(); m = read(); T = read(); 
	for(int i = 1; i <= n; ++ i){
		inserta(read(), 1, i, 1, n);
	}
	for(int i = 1; i <= m; ++ i){
		insertb(read(), 1, i, 1, m);
	}
	while(T --){
		mxza = -1, mxfa = -2e9, miza = 2e9, mifa = 1;
		mxb = -2e9; mib = 2e9;
		ans = -9e18;
		int l1 = read(), r1 = read(), l2 = read(), r2 = read();
		querya(1, 1, n, l1, r1);
		queryb(1, 1, m, l2, r2);
		if(mxb < 0){
			if(mifa < 0) ans = mifa * mxb;
			else ans = mib * miza;
		}
		else if(mib >= 0){
			if(mxza >= 0) ans = mib * mxza;
			else ans = mxb * mxfa;
		}
		else{
			if(miza != 2e9){
				ans = max(ans,miza*mib);
			}
			if(mxfa != -2e9){
				ans = max(ans,mxfa*mxb);
			}
		}
		printf("%lld\n", ans);
	}
}
2022/11/3 14:40
加载中...