社区讨论
80pts,求调!!!
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo7n7wld
- 此快照首次捕获于
- 2023/10/27 04:34 2 年前
- 此快照最后确认于
- 2023/10/27 04:34 2 年前
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000005;
ll a[N],b[N];
ll zmaxx1[N],zminn1[N],fmaxx1[N],fminn1[N];
ll zmaxx2[N],zminn2[N],fmaxx2[N],fminn2[N];
ll ling1[N],ling2[N];
ll zma1,zmi1,fma1,fmi1,zma2,zmi2,fma2,fmi2,L1,L2;
ll Max(ll x,ll y) {
if (x>y)
return x;
return y;
}
ll Min(ll x,ll y) {
if (x<y)
return x;
return y;
}
void build1(int k,int l,int r) {
if (l==r) {
if (a[l]==0) {
ling1[k]=1;
zmaxx1[k]=-1;
zminn1[k]=1e12;
fmaxx1[k]=-1e12;
fminn1[k]=1;
return;
}
if (a[l]>0) {
zmaxx1[k]=zminn1[k]=a[l];
fmaxx1[k]=-1e12;
fminn1[k]=1;
}
if (a[l]<0) {
zmaxx1[k]=-1;
zminn1[k]=1e12;
fmaxx1[k]=fminn1[k]=a[l];
}
return;
}
int mid=l+r>>1;
build1(k<<1,l,mid);
build1(k<<1|1,mid+1,r);
zmaxx1[k]=Max(zmaxx1[k<<1],zmaxx1[k<<1|1]);
zminn1[k]=Min(zminn1[k<<1],zminn1[k<<1|1]);
fmaxx1[k]=Max(fmaxx1[k<<1],fmaxx1[k<<1|1]);
fminn1[k]=Min(fminn1[k<<1],fminn1[k<<1|1]);
ling1[k]=Max(ling1[k<<1],ling1[k<<1|1]);
}
void build2(int k,int l,int r) {
if (l==r) {
if (b[l]==0) {
ling2[k]=1;
zmaxx2[k]=-1;
zminn2[k]=1e12;
fmaxx2[k]=-1e12;
fminn2[k]=1;
return;
}
if (b[l]>0) {
zmaxx2[k]=zminn2[k]=b[l];
fmaxx2[k]=-1e12;
fminn2[k]=1;
}
if (b[l]<0) {
zmaxx2[k]=-1;
zminn2[k]=1e12;
fmaxx2[k]=fminn2[k]=b[l];
}
return;
}
int mid=l+r>>1;
build2(k<<1,l,mid);
build2(k<<1|1,mid+1,r);
zmaxx2[k]=Max(zmaxx2[k<<1],zmaxx2[k<<1|1]);
zminn2[k]=Min(zminn2[k<<1],zminn2[k<<1|1]);
fmaxx2[k]=Max(fmaxx2[k<<1],fmaxx2[k<<1|1]);
fminn2[k]=Min(fminn2[k<<1],fminn2[k<<1|1]);
ling2[k]=Max(ling2[k<<1],ling2[k<<1|1]);
}
void query_1(int k,int l,int r,int x,int y) {
if (l>=x && r<=y) {
zma1=Max(zma1,zmaxx1[k]);
fma1=Max(fma1,fmaxx1[k]);
zmi1=Min(zmi1,zminn1[k]);
fmi1=Min(fmi1,fminn1[k]);
return;
}
int mid=l+r>>1;
if (mid>=x)
query_1(k<<1,l,mid,x,y);
if (mid<y)
query_1(k<<1|1,mid+1,r,x,y);
}
void query_2(int k,int l,int r,int x,int y) {
if (l>=x && r<=y) {
zma2=Max(zma2,zmaxx2[k]);
fma2=Max(fma2,fmaxx2[k]);
zmi2=Min(zmi2,zminn2[k]);
fmi2=Min(fmi2,fminn2[k]);
return;
}
int mid=l+r>>1;
if (mid>=x)
query_2(k<<1,l,mid,x,y);
if (mid<y)
query_2(k<<1|1,mid+1,r,x,y);
}
void query_L1(int k,int l,int r,int x,int y) {
if (l>=x && r<=y) {
L1=Max(L1,ling1[k]);
return;
}
int mid=l+r>>1;
if (mid>=x)
query_L1(k<<1,l,mid,x,y);
if (mid<y)
query_L1(k<<1|1,mid+1,r,x,y);
}
void query_L2(int k,int l,int r,int x,int y) {
if (l>=x && r<=y) {
L2=Max(L2,ling2[k]);
return;
}
int mid=l+r>>1;
if (mid>=x)
query_L2(k<<1,l,mid,x,y);
if (mid<y)
query_L2(k<<1|1,mid+1,r,x,y);
}
int main() {
int n,m,q,l1,r1,l2,r2;
cin>>n>>m>>q;
for (int i = 1; i <= n; i++)
scanf("%lld",&a[i]);
for (int i = 1; i <= m; i++)
scanf("%lld",&b[i]);
if (n<=200)
{
while (q--)
{
ll ans=-1e18;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
for (int i = l1; i <= r1; i++)
{
ll now=1e18;
for (int j = l2; j <= r2; j++)
now=Min(now,a[i]*b[j]);
ans=Max(ans,now);
}
printf("%lld\n",ans);
}
return 0;
}
for (int i = 1; i <= 1000000; i++)
{
zmaxx1[i]=zmaxx2[i]=-1;
zminn1[i]=zminn2[i]=1e12;
fmaxx1[i]=fmaxx2[i]=-1e12;
fminn1[i]=fminn2[i]=1;
}
build1(1,1,n);
build2(1,1,m);
while (q--) {
L1=0,L2=0;
zma1=zma2=-1;
fma1=fma2=-1e12;
zmi1=zmi2=1e12;
fmi1=fmi2=1;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
query_1(1,1,n,l1,r1);
query_2(1,1,m,l2,r2);
query_L1(1,1,n,l1,r1);
query_L2(1,1,m,l2,r2);
ll ans=-1e18,now;
if (L1==1)
ans=0;
if (zma1!=-1) {
now=1e18;
if (L2==1)
now=0;
if (zma2!=-1) {
now=Min(now,zma1*zma2);
}
if (zmi2!=1e12) {
now=Min(now,zma1*zmi2);
}
if (fma2!=-1e12) {
now=Min(now,zma1*fma2);
}
if (fmi2!=1) {
now=Min(now,zma1*fmi2);
}
}
ans=Max(ans,now);
if (zmi1!=1e12) {
now=1e18;
if (L2==1)
now=0;
if (zma2!=-1) {
now=Min(now,zmi1*zma2);
}
if (zmi2!=1e12) {
now=Min(now,zmi1*zmi2);
}
if (fma2!=-1e12) {
now=Min(now,zmi1*fma2);
}
if (fmi2!=1) {
now=Min(now,zmi1*fmi2);
}
}
ans=Max(ans,now);
if (fma1!=-1e12) {
now=1e18;
if (L2==1)
now=0;
if (zma2!=-1) {
now=Min(now,fma1*zma2);
}
if (zmi2!=1e12) {
now=Min(now,fma1*zmi2);
}
if (fma2!=-1e12) {
now=Min(now,fma1*fma2);
}
if (fmi2!=1) {
now=Min(now,fma1*fmi2);
}
}
ans=Max(ans,now);
if (fmi1!=1) {
now=1e18;
if (L2==1)
now=0;
if (zma2!=-1) {
now=Min(now,fmi1*zma2);
}
if (zmi2!=1e12) {
now=Min(now,fmi1*zmi2);
}
if (fma2!=-1e12) {
now=Min(now,fmi1*fma2);
}
if (fmi2!=1) {
now=Min(now,fmi1*fmi2);
}
}
ans=Max(ans,now);
printf("%lld\n",ans);
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...