P8818 策略游戏的神奇操作
现在第二个样例的第一组数据输出-2
其中a[6]在rmq过程中在ani[3][2]后没有继续传递
不知道怎么调,求助,悬关1
代码如下
#include<bits/stdc++.h>
using namespace std;
const int size=1e5+5,siz=1e5+1;
int n,m,q,lx,rx,ly,ry,mi[30];
long long a[size],b[size],ai[size][30],aa[size][30],aia[size][30],ani[size][30],bi[size][30],ba[size][30];
// 数组a 数组b a的区间min a的区间max a的负数区间max a的非负数区间min b的区间min b的区间max
void init()
{
mi[0]=1; for(int i=1;i<=29;i++)mi[i]=mi[i-1]*2;
fill(&ai[0][0],&ai[siz][29],1e10);
fill(&ani[0][0],&ani[siz][29],1e10);
fill(&aa[0][0],&aa[siz][29],-1e10);
fill(&aia[0][0],&aia[siz][29],-1e10);
fill(&ba[0][0],&ba[siz][29],-1e10);
fill(&bi[0][0],&bi[siz][29],1e10);
}
int main()
{
init();
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
ai[i][0]=aa[i][0]=a[i];
if(a[i]<0)aia[i][0]=a[i];
if(a[i]>=0)ani[i][0]=a[i];
}
for(int i=1;i<=m;i++)
{
scanf("%lld",&b[i]);
bi[i][0]=ba[i][0]=b[i];
}
for(int j=1;mi[j]<=n;j++)
{
for(int i=1;i+mi[j]-1<=n;i++)
{
ai[i][j]=min(ai[i][j-1],ai[i+mi[j-1]][j-1]);
aa[i][j]=max(aa[i][j-1],aa[i+mi[j-1]][j-1]);
aia[i][j]=max(aia[i][j-1],aia[i+mi[j-1]][j-1]);
ani[i][j]=min(ani[i][j-1],ani[i+mi[j-1]][j-1]);
}
}
for(int j=1;mi[j]<=m;j++)
{
for(int i=1;i+mi[j]-1<=m;i++)
{
bi[i][j]=min(bi[i][j-1],bi[i+mi[j-1]][j-1]);
ba[i][j]=max(ba[i][j-1],ba[i+mi[j-1]][j-1]);
}
}
for(int i=1;i<=q;i++)
{
scanf("%d%d%d%d",&lx,&rx,&ly,&ry);
int key1=log2(rx-lx+1),key2=log2(ry-ly+1);
int fy=ly+mi[key2]+1,fx=lx+mi[key1]+1;
long long ans=-1e10;
long long y_min=min(bi[ly][key2],bi[fy][key2]);
long long y_max=max(ba[ly][key2],ba[fy][key2]);
long long x_min=min(ai[lx][key1],ai[fx][key1]);
long long x_max=max(aa[lx][key1],aa[fx][key1]);
long long xb=max(aia[lx][key1],aia[fx][key1]);
long long xs=min(ani[lx][key1],ani[fx][key1]);
long long p1=x_max*(x_max>=0?y_min:y_max),p2=x_min*(x_min>=0?y_min:y_max);
long long q1=xb*(xb>=0?y_min:y_max),q2=xs*(xs>=0?y_min:y_max);
// cout<<x_min<<" "<<x_max<<" "<<xb<<" "<<xs<<" "<<y_min<<" "<<y_max<<endl;
ans=max(p1,p2);
if(xb!=-1e10)ans=max(ans,q1);
if(xs!=1e10)ans=max(ans,q2);
printf("%lld\n",ans);
}
}
/*
x>=0 y_min => 1.y>=0 => x_max 2.y<0 => x+_min
x<0 y_max => 1.y>=0 => x-_max 2.y<0 => x_min
*/