MnZn求助!
查看原帖
MnZn求助!
156297
Valhalla_Is_Calling楼主2022/10/30 10:48
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<climits>
#define ll long long
using namespace std;
const ll N=1e5+5;
ll n,m,q;
ll a[N],b[N];
// ll xl,xr,yl,yr;
struct Queries
{
    ll xl,xr,yl,yr;
}qu[N];
struct SegTree
{
    ll l,r,maxn,minn;
}t[N<<2][3];
ll read()
{
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
void BuildTree(ll opt,ll p,ll l,ll r)
{
    t[p][opt].l=l,t[p][opt].r=r;
    t[p][opt].maxn=LLONG_MIN;
    t[p][opt].minn=LLONG_MAX;
    if(l==r)
    {
        t[p][opt].maxn=(opt==1)?a[l]:b[l];
        t[p][opt].minn=(opt==1)?a[l]:b[l];
        return ;
    }
    ll mid=(l+r)>>1;
    BuildTree(opt,p<<1,l,mid);
    BuildTree(opt,p<<1|1,mid+1,r);
    t[p][opt].maxn=max(t[p<<1][opt].maxn,t[p<<1|1][opt].maxn);
    t[p][opt].minn=min(t[p<<1][opt].minn,t[p<<1|1][opt].minn);
}
ll querymax(ll opt,ll p,ll l,ll r)
{
    if(l<=t[p][opt].l && t[p][opt].r<=r) return t[p][opt].maxn;
    ll mid=(t[p][opt].l+t[p][opt].r)>>1;
    ll ans=LLONG_MIN;
    if(l<=mid) ans=max(ans,querymax(opt,p<<1,l,r));
    if(mid<r) ans=max(ans,querymax(opt,p<<1|1,l,r));
    return ans;
}
ll querymin(ll opt,ll p,ll l,ll r)
{
    if(l<=t[p][opt].l && t[p][opt].r<=r) return t[p][opt].minn;
    ll mid=(t[p][opt].l+t[p][opt].r)>>1;
    ll ans=LLONG_MAX;
    if(l<=mid) ans=min(ans,querymin(opt,p<<1,l,r));
    if(mid<r) ans=min(ans,querymin(opt,p<<1|1,l,r));
    return ans;
}
void Sub1()
{
    ll ans=1;
    for(ll i=1;i<=q;i++)
    {
        ll maxx=querymax(1,1,qu[i].xl,qu[i].xr);
        ll minx=querymin(2,1,qu[i].yl,qu[i].yr);
        ans=maxx*minx;
        printf("%lld\n",ans);
    }
}
void condition_one(ll pos)
{
    ll x=pos;
    ll part1=a[qu[x].xl],part2;
    if(part1>=0) part2=querymin(2,1,qu[x].yl,qu[x].yr);
    else part2=querymax(2,1,qu[x].yl,qu[x].yr);
    ll ans=part1*part2;
    printf("%lld\n",ans);
}
void condition_two(ll x)
{
    ll part1,part2=b[qu[x].yl];
    if(part2>=0) part1=querymax(1,1,qu[x].xl,qu[x].xr);
    else part1=querymin(1,1,qu[x].xl,qu[x].xr);
    ll ans=part1*part2;
    printf("%lld\n",ans);
}
void Sub2()
{
    for(ll i=1;i<=q;i++)
    {
        if(qu[i].xl==qu[i].xr) condition_one(i);
        else condition_two(i);
    }
}
int main()
{
    // freopen("game.in","r",stdin);
    // freopen("game.out","w",stdout);
    n=read(),m=read(),q=read();
    bool sub1flag=true,sub2flag=true;
    for(ll i=1;i<=n;i++) a[i]=read(),sub1flag&=(a[i]>0);
    for(ll i=1;i<=m;i++) b[i]=read(),sub1flag&=(b[i]>0);
    for(ll i=1;i<=q;i++)
    {
        qu[i].xl=read(),qu[i].xr=read();
        qu[i].yl=read(),qu[i].yr=read();
        if(qu[i].xl!=qu[i].xr && qu[i].yl!=qu[i].yr) sub2flag=false;
    }
    BuildTree(1,1,1,n);
    // for(ll i=1;i<=10;i++) cout<<t[i][1].l<<" "<<t[i][1].r<<" "<<t[i][1].maxn<<" "<<t[i][1].minn<<endl;
    BuildTree(2,1,1,m);
    // cout<<t[1][1].r<<endl;
    // ll testnum=read();
    // while(testnum--)
    // {
    //     ll o=read(),l=read(),r=read();
    //     if(o==1) cout<<querymax(2,1,l,r)<<endl;
    //     else cout<<querymin(2,1,l,r)<<endl;
    // }
    if(sub1flag)
    {
        Sub1();
        return 0;
    }
    if(sub2flag)
    {
        Sub2();
        return 0;
    }
    return 0;
}

这个代码LG测一直是65pts,但是到IOJ上就是40pts,有大佬帮忙看看是怎么回事吗?

Ps:IOJ是多WA了几个点

谢谢!

2022/10/30 10:48
加载中...