[CSP-S 2022] 策略游戏WA 4,19,20 求调
查看原帖
[CSP-S 2022] 策略游戏WA 4,19,20 求调
190485
CH_mengxiang楼主2022/10/30 20:12

山东人想来试试水,结果...WA85pts

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const LL N=1e5+1,INF=1e18;
LL fa1[N][32],fa2[N][32],fb1[N][32],fb2[N][32],as1[N][32],as2[N][32],lg[N];
//fa1:a->max  fa2:a->min  fb1:b->max  fb2:b->min
//as1:a>=0->min as2:a<0->max
int main()
{
//	freopen("game3.in","r",stdin);
//	freopen("game3.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n,m,q,l1,r1,l2,r2;
	LL a1,a2,b1,b2,s1,s2;
	cin>>n>>m>>q;
	for (int i=2;i<=max(n,m);i++)
	  lg[i]=lg[i>>1]+1;//预处理log(n) 
	for (int i=1;i<=n;i++)
	{
		cin>>fa1[i][0];
		fa2[i][0]=fa1[i][0];
		if (fa1[i][0]>=0) as1[i][0]=fa1[i][0],as2[i][0]=-INF;
		else as1[i][0]=INF,as2[i][0]=fa1[i][0];
	}
	for (int i=1;i<=m;i++)
	{
		cin>>fb1[i][0];
		fb2[i][0]=fb1[i][0];
	}
	for (int j=1;j<=lg[n];j++)//ST表预处理 
	  for (int i=1;i+(1<<j)-1<=n;i++)
	  {
	  	fa1[i][j]=max(fa1[i][j-1],fa1[i+(1<<(j-1))][j-1]);
	  	fa2[i][j]=min(fa2[i][j-1],fa2[i+(1<<(j-1))][j-1]);
	  	as1[i][j]=min(as1[i][j-1],as1[i+(1<<(j-1))][j-1]);
	  	as2[i][j]=max(as2[i][j-1],as2[i+(1<<(j-1))][j-1]);
	  }
	for (int j=1;j<=lg[m];j++)
	  for (int i=1;i+(1<<j)-1<=m;i++)
	  {
	  	fb1[i][j]=max(fb1[i][j-1],fb1[i+(1<<(j-1))][j-1]);
	  	fb2[i][j]=min(fb2[i][j-1],fb2[i+(1<<(j-1))][j-1]);
	  }
	while (q--)
	{
		cin>>l1>>r1>>l2>>r2;
		a1=max(fa1[l1][lg[r1-l1+1]],fa1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
		a2=min(fa2[l1][lg[r1-l1+1]],fa2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
		b1=max(fb1[l2][lg[r2-l2+1]],fb1[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]);
		b2=min(fb2[l2][lg[r2-l2+1]],fb2[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]);
		s1=min(as1[l1][lg[r1-l1+1]],as1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
		s2=max(as2[l1][lg[r1-l1+1]],as2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
		if (a2>=0)//a全部为非负数 
		{
			if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数 
			else cout<<a2*b2<<"\n";//b能取负数 
		}
		else if (a1<0)//a全部为负数 
		{
			if (b2>=0) cout<<a1*b1<<"\n";//b全部为非负数 
			else cout<<a2*b1<<"\n";//b能取负数 
		}
		else//a既能取非负数也能取负数 
		{
			if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数 
			else if (b1<=0) cout<<a2*b1<<"\n";//b全部为非正数 
			else cout<<max(s1*b2,s2*b1)<<"\n";//b既能取非负数也能取负数 
		}
	}
	return 0;
}

2022/10/30 20:12
加载中...