Unaccepted 100求调
查看原帖
Unaccepted 100求调
542063
MightZero楼主2023/10/18 21:36

rt,Substack2 WA了3个点

#include<bits/stdc++.h>
int lg2[100010];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void init(int n)
{
    lg2[0]=-1;
    for(int i=1;i<=n;i++) lg2[i]=lg2[i>>1]+1;
    return;
}
using namespace std;
class STT{
	public:
    int flag;
    int st[100010][20];
    int sz;
    int get(int a,int b)
    {
        return (flag*(a-b)<0)? a : b;
    }
    STT(int *data,int sz,int _f)
    {
        flag=_f;
        for(int i=1;i<=sz;i++)
            st[i][0]=data[i];
        for(int i=1;i<=lg2[sz];i++)
        {
            for(int j=1;j+(1<<i)-1<=sz;j++)
            {
                st[j][i]=get(st[j][i-1],st[j+(1<<(i-1))][i-1]);
            }
		}
        
    }
    int query(int l,int r)
    {
        int len=r-l+1;
        return get(st[l][lg2[len]],st[r-(1<<lg2[len])+1][lg2[len]]);
    }
};
namespace MZ
{
    int n,m,q,a[100010],b[100010];
    int c[100010];
    int main()
    {
        n=read();m=read();q=read();
        init(n);
        for(int i=1;i<=n;i++)
        {
            a[i]=read();
        }
        STT amax(a,n,-1),amin(a,n,1);
        
        for(int i=1;i<=n;i++)
        {
        	if(a[i]<0)c[i]=0x7fffffff;
        	else c[i]=a[i];
        }
        STT apmin(c,n,1);
        for(int i=1;i<=n;i++)
        {
        	if(a[i]>=0)c[i]=0x80000000;
        	else c[i]=a[i];
        }
        STT anmax(c,n,-1);
        for(int i=1;i<=m;i++)
        {
            b[i]=read();
        }
        STT bmin(b,m,1),bmax(b,m,-1);
        while(q--)
        {
        	int l1=read(),r1=read(),l2=read(),r2=read();
        	long long ans=0x8000000000000000;
        	int maxa=amax.query(l1,r1);
        	int mina=amin.query(l1,r1);
        	int minpa=apmin.query(l1,r1);
        	int maxna=anmax.query(l1,r1);
        	int maxb=bmax.query(l2,r2);
        	int minb=bmin.query(l2,r2);
        	ans=max(ans,1ll*maxa*(maxa>=0?minb:maxb));
        	ans=max(ans,1ll*mina*(mina>=0?minb:maxb));
        	if(minpa!=0x7fffffff)ans=max(ans,1ll*minpa*(minpa>=0?minb:maxb));
        	if(maxna!=0x80000000)ans=max(ans,1ll*maxna*(maxna>=0?minb:maxb));
        	cout<<ans<<endl;
        }
        return 0;
    }
}

int main()
{
    return MZ::main();
}
2023/10/18 21:36
加载中...