Submission #1191726

#TimeUsernameProblemLanguageResultExecution timeMemory
1191726AlgorithmWarriorEscape Route 2 (JOI24_escape2)C++20
54 / 100
3093 ms29968 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ff first
#define ss second

using namespace std;

long long const INF=1e18;
int const MAX=100005;
int const LOG=20;
int n,t;
int nrd[MAX];
vector<pii>drum[MAX];
int ln[MAX],rn[MAX];
int tata[MAX];
long long spn[MAX],spm[MAX];
vector<int>sons[MAX];
int lift[MAX][LOG];

void read(){
    cin>>n>>t;
    int i,j;
    for(i=1;i<n;++i){
        cin>>nrd[i];
        ln[i]=rn[i-1]+1;
        rn[i]=ln[i]+nrd[i]-1;
        for(j=0;j<nrd[i];++j){
            int a,b;
            cin>>a>>b;
            drum[i].push_back({a,b});
        }
        sort(drum[i].begin(),drum[i].end());
    }
}

void create_forest(){
    int i,j;
    for(i=1;i<=n-2;++i){
        vector<int>best;
        best.resize(nrd[i+1]);
        best[nrd[i+1]-1]=nrd[i+1]-1;
        for(j=nrd[i+1]-2;j>=0;--j)
            if(drum[i+1][j].ss<drum[i+1][best[j+1]].ss)
                best[j]=j;
            else
                best[j]=best[j+1];
        for(j=0;j<nrd[i];++j){
            auto it=lower_bound(drum[i+1].begin(),drum[i+1].end(),make_pair(drum[i][j].ss,0));
            if(it==drum[i+1].end()){
                tata[ln[i]+j]=ln[i+1]+best[0];
                sons[ln[i+1]+best[0]].push_back(ln[i]+j);
                spm[ln[i]+j]=t-drum[i][j].ss+drum[i+1][best[0]].ff;
            }
            else{
                int id=it-drum[i+1].begin();
                tata[ln[i]+j]=ln[i+1]+best[id];
                sons[ln[i+1]+best[id]].push_back(ln[i]+j);
                spm[ln[i]+j]=drum[i+1][best[id]].ff-drum[i][j].ss;
            }
        }
    }
    for(i=1;i<n;++i)
        for(j=0;j<nrd[i];++j)
            spn[ln[i]+j]=drum[i][j].ss-drum[i][j].ff;
}

void dfs(int nod){
    spm[nod]+=spn[tata[nod]];
    spn[nod]+=spm[nod];
    int i;
    lift[nod][0]=tata[nod];
    for(i=1;i<LOG;++i)
        lift[nod][i]=lift[lift[nod][i-1]][i-1];
    for(auto fiu : sons[nod])
        dfs(fiu);
}

void dfs_driver(){
    int i;
    for(i=ln[n-1];i<=rn[n-1];++i)
        dfs(i);
}

int anc(int nod,int h){
    int i;
    for(i=0;i<LOG;++i)
        if(h&(1<<i))
            nod=lift[nod][i];
    return nod;
}

void minself(long long& x,long long val){
    if(x>val)
        x=val;
}

long long solve(int st,int dest){
    long long ans=INF;
    int h=dest-st-1;
    int i;
    for(i=ln[st];i<=rn[st];++i){
        int stramos=anc(i,h);
        minself(ans,spn[i]-spm[stramos]);
    }
    return ans;
}

void process_queries(){
    int i;
    int q;
    cin>>q;
    for(i=1;i<=q;++i){
        int st,dest;
        cin>>st>>dest;
        cout<<solve(st,dest)<<'\n';
    }
}

int main()
{
    read();
    create_forest();
    dfs_driver();
    process_queries();
    return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...