Submission #363671

#TimeUsernameProblemLanguageResultExecution timeMemory
363671denkendoemeerAbduction 2 (JOI17_abduction2)C++14
100 / 100
2130 ms128364 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int inf=1e9;
struct ain
{
    int aint[(1<<18)];
    void update(int nod,int st,int dr,int poz,int val)
    {
        if (st==dr){
            aint[nod]=val;
            return ;
        }
        int mij=(st+dr)/2;
        if (poz<=mij)
            update(nod*2,st,mij,poz,val);
        else
            update(nod*2+1,mij+1,dr,poz,val);
        aint[nod]=max(aint[nod*2],aint[nod*2+1]);
    }
    int query1(int nod,int st,int dr,int poz,int val)
    {
        if (poz<=st || aint[nod]<val)
            return inf;
        if (st==dr)
            return st;
        int mij=(st+dr)/2,ans;
        ans=query1(nod*2+1,mij+1,dr,poz,val);
        if (ans<poz)
            return ans;
        return query1(nod*2,st,mij,poz,val);
    }
    int query2(int nod,int st,int dr,int poz,int val)
    {
        if (dr<=poz || aint[nod]<val)
            return -1;
        if (st==dr)
            return st;
        int mij=(st+dr)/2,ans;
        ans=query2(nod*2,st,mij,poz,val);
        if (ans>poz)
            return ans;
        return query2(nod*2+1,mij+1,dr,poz,val);
    }
}ai1,ai2;
ll quer1(int x,int y);
ll quer2(int x,int y);
int h,w,a[50005],b[50005];
ll has(int x,int y)
{
    return 1LL*x*50003+y;
}
map<ll,ll>mp1,mp2;
ll quer1(int x,int y)
{
    if (mp1[has(x,y)])
        return mp1[has(x,y)];
    ll ans1,ans2;
    int poz;
    poz=ai1.query1(1,1,h,x,b[y]);
    if (poz<x)
        ans1=quer2(poz,y)+x-poz;
    else
        ans1=x-1;
    poz=ai1.query2(1,1,h,x,b[y]);
    if (poz>x)
        ans2=quer2(poz,y)+poz-x;
    else
        ans2=h-x;
    mp1[has(x,y)]=max(ans1,ans2);
    return max(ans1,ans2);
}
ll quer2(int x,int y)
{
    if (mp2[has(x,y)])
        return mp2[has(x,y)];
    ll ans1,ans2;
    int poz;
    poz=ai2.query1(1,1,w,y,a[x]);
    if (poz<y)
        ans1=quer1(x,poz)+y-poz;
    else
        ans1=y-1;
    poz=ai2.query2(1,1,w,y,a[x]);
    if (poz>y)
        ans2=quer1(x,poz)+poz-y;
    else
        ans2=w-y;
    mp2[has(x,y)]=max(ans1,ans2);
    ll aux=mp2[has(x,y)];
    return aux;
}
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int q,i;
    scanf("%d%d%d",&h,&w,&q);
    for(i=1;i<=h;i++)
        scanf("%d",&a[i]),ai1.update(1,1,h,i,a[i]);
    for(i=1;i<=w;i++)
        scanf("%d",&b[i]),ai2.update(1,1,w,i,b[i]);
    for(i=1;i<=q;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        ll a=quer1(x,y);
        ll b=quer2(x,y);
        printf("%lld\n",max(a,b));
    }
return 0;
}

Compilation message (stderr)

abduction2.cpp: In function 'int main()':
abduction2.cpp:98:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   98 |     scanf("%d%d%d",&h,&w,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
abduction2.cpp:100:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  100 |         scanf("%d",&a[i]),ai1.update(1,1,h,i,a[i]);
      |         ~~~~~^~~~~~~~~~~~
abduction2.cpp:102:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  102 |         scanf("%d",&b[i]),ai2.update(1,1,w,i,b[i]);
      |         ~~~~~^~~~~~~~~~~~
abduction2.cpp:105:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  105 |         scanf("%d%d",&x,&y);
      |         ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...