Submission #1262710

#TimeUsernameProblemLanguageResultExecution timeMemory
1262710user736482Abduction 2 (JOI17_abduction2)C++20
100 / 100
1257 ms169792 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000007
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099

map<pair<pair<ll,ll>,ll>,ll>mem;

ll mx[50007][16][2];
ll h,w,q,a,b;

ll wlw(ll x,ll g,ll idx){
    for(ll j=15;j>=0;j--){
        if(g>=(1<<j) && mx[g-(1<<j)][j][idx]<x){
            g=g-(1<<j);
        }
    }
    return g-1;
}
ll wpw(ll x,ll g,ll idx){
    for(ll j=15;j>=0;j--){
        if(mx[g+1][j][idx]<x){
           // cout<<j<<" ";
            g=g+(1<<j);
        }
    }
    return g+1;
}

ll slv(ll x,ll y,ll idx){
    if(x<0 || y<0 || x>=h || y>=w)return -1;
    if(mem.find({{x,y},idx})!=mem.end())return mem[{{x,y},idx}];
    if(idx==0){
        //cout<<"xd1"<<flush;
        //cout<<mx[y][0][1]<<" 1  ";
        ll lw=wlw(mx[y][0][1],x,0);
        ll pw=wpw(mx[y][0][1],x,0);
        
        mem[{{x,y},idx}]=max(slv(lw,y,!idx)+x-lw,slv(pw,y,!idx)+pw-x);
        //cout<<"\n";
        return mem[{{x,y},idx}];
    }
    else{
        //cout<<"xd2"<<flush;
        //cout<<mx[x][0][0]<<" 2  ";
        ll lw=wlw(mx[x][0][0],y,1);
        //cout<<"xd2"<<flush;
        ll pw=wpw(mx[x][0][0],y,1);
        
        //cout<<x<<" "<<y<<" "<<lw<< " "<<pw<<"\n"<<flush;
        mem[{{x,y},idx}]=max(slv(x,lw,!idx)+y-lw,slv(x,pw,!idx)+pw-y);
        //cout<<"\n";
        return mem[{{x,y},idx}];
    }
}

int main(){
    cin>>h>>w>>q;
    for(ll i=0;i<50007;i++)for(ll j=0;j<16;j++)for(ll k=0;k<2;k++)mx[i][j][k]=INFL;
    for(ll i=0;i<h;i++){
        cin>>mx[i][0][0];
    }
    for(ll i=0;i<w;i++){
        cin>>mx[i][0][1];
    }
    for(ll j=1;j<16;j++){
        for(ll i=0;i+(1<<j)<=h;i++){
            mx[i][j][0]=max(mx[i][j-1][0],mx[i+(1<<(j-1))][j-1][0]);
            //cout<<mx[i][j][0]<<" ";
        }
        //cout<<"\n";
        for(ll i=0;i+(1<<j)<=w;i++){
            mx[i][j][1]=max(mx[i][j-1][1],mx[i+(1<<(j-1))][j-1][1]);
            //cout<<mx[i][j][1]<<" ";
        }
        //cout<<"\n\n";
    }
    //cout<<"xd";
    //return 0;
    for(ll i=0;i<q;i++){
        cin>>a>>b;
        cout<<max(slv(a-1,b-1,0),slv(a-1,b-1,1))<<"\n";
    }
}
#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...