求助,悬关
  • 板块灌水区
  • 楼主Rem_CandleFire
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/16 13:48
  • 上次更新2023/11/2 13:28:42
查看原帖
求助,悬关
421421
Rem_CandleFire楼主2023/10/16 13:48

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
*/
2023/10/16 13:48
加载中...