S-T2 95pts,WA on 3 求助
  • 板块灌水区
  • 楼主nullqtr_pwp急寄喵
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/29 21:08
  • 上次更新2023/10/27 05:03:40
查看原帖
S-T2 95pts,WA on 3 求助
605313
nullqtr_pwp急寄喵楼主2022/10/29 21:08

rt

#include<bits/stdc++.h>
#define int long long
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
const int maxn=114514;
int a[maxn],b[maxn],mx[maxn<<2],mn[maxn<<2],mn1[maxn<<2],mx1[maxn<<2];
void pushup(int o){
    mx[o]=max(mx[ls],mx[rs]);
    mn[o]=min(mn[ls],mn[rs]);
}
void pushup1(int o){
    mn1[o]=min(mn1[ls],mn1[rs]);
    mx1[o]=max(mx1[ls],mx1[rs]);
}
void build(int o,int l,int r){
    if(l==r) return mn[o]=mx[o]=a[l],void();
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(o);
}
void build1(int o,int l,int r){
    if(l==r) return mn1[o]=mx1[o]=b[l],void();
    int mid=(l+r)>>1;
    build1(ls,l,mid);
    build1(rs,mid+1,r);
    pushup1(o);
}
int querymin(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return mn[o];
    int rt=0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=min(rt,querymin(ls,l,mid,ql,qr));
    if(qr>mid) rt=min(rt,querymin(rs,mid+1,r,ql,qr));
    pushup(o);
    return rt;
}
int querymin1(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return mn1[o];
    int rt=0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=min(rt,querymin1(ls,l,mid,ql,qr));
    if(qr>mid) rt=min(rt,querymin1(rs,mid+1,r,ql,qr));
    pushup1(o);
    return rt;
}
int querymax(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return mx[o];
    int rt=-0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=max(rt,querymax(ls,l,mid,ql,qr));
    if(qr>mid) rt=max(rt,querymax(rs,mid+1,r,ql,qr));
    pushup(o);
    return rt;
}
int querymax1(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return mx1[o];
    int rt=-0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=max(rt,querymax1(ls,l,mid,ql,qr));
    if(qr>mid) rt=max(rt,querymax1(rs,mid+1,r,ql,qr));
    pushup1(o);
    return rt;
}
int c[maxn<<2],d[maxn<<2],tc[maxn<<2],td[maxn<<2];
void build2(int o,int l,int r){
    if(l==r) return tc[o]=c[l],void();
    int mid=(l+r)>>1;
    build2(ls,l,mid);
    build2(rs,mid+1,r);
    tc[o]=min(tc[ls],tc[rs]);
}
void build3(int o,int l,int r){
    if(l==r) return td[o]=d[l],void();
    int mid=(l+r)>>1;
    build3(ls,l,mid);
    build3(rs,mid+1,r);
    td[o]=max(td[ls],td[rs]);
}
int querymin2(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return tc[o];
    int rt=0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=min(rt,querymin2(ls,l,mid,ql,qr));
    if(qr>mid) rt=min(rt,querymin2(rs,mid+1,r,ql,qr));
    tc[o]=min(tc[ls],tc[rs]);
    return rt;
}
int querymax2(int o,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr) return td[o];
    int rt=-0x3f3f3f3f,mid=(l+r)>>1;
    if(ql<=mid) rt=max(rt,querymax2(ls,l,mid,ql,qr));
    if(qr>mid) rt=max(rt,querymax2(rs,mid+1,r,ql,qr));
    td[o]=max(td[ls],td[rs]);
    return rt;
}
signed main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
	int n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++) b[i]=read();
	for(int i=1;i<=n;i++){
		if(a[i]==0) c[i]=d[i]=0;
		else if(a[i]<0) c[i]=0x3f3f3f3f,d[i]=a[i];
		else c[i]=a[i],d[i]=-0x3f3f3f3f;
	}
	build(1,1,n);
	build1(1,1,m);
	build2(1,1,n);
	build3(1,1,n);
	while(q--){
		int l1=read(),r1=read(),l2=read(),r2=read(),ans=0;
		int amn=querymin(1,1,n,l1,r1),bmn=querymin1(1,1,m,l2,r2),amx=querymax(1,1,n,l1,r1),bmx=querymax1(1,1,m,l2,r2);
		if(bmn<0){//have negative number
			if(amn>=0){//dont have negative
				ans=bmn*amn;
				printf("%lld\n",ans);
				continue;
			}
			else{
				if(bmx<=0){
					ans=bmx*amn;
					printf("%lld\n",ans);
					continue;
				}
				else{
					int cmn=querymin2(1,1,n,l1,r1),dmx=querymax2(1,1,n,l1,r1);
					ans=max(cmn*bmn,dmx*bmx);
					printf("%lld\n",ans);
					continue;
				}
			}
		}
		else{// dont have negative number
			int dmx=querymax2(1,1,n,l1,r1);
			int p=bmn*amx,q=dmx*bmx;
			if(p<0&&q<0) ans=min(p,q);
			else if(p>0) ans=p;
			printf("%lld\n",ans);
			continue;
		}
	}
	return 0;
}
2022/10/29 21:08
加载中...