Submission #1184390

#TimeUsernameProblemLanguageResultExecution timeMemory
1184390ttamxEscape Route 2 (JOI24_escape2)C++20
100 / 100
1726 ms124376 KiB
#include<bits/stdc++.h>
#define cerr if(0)cerr

using namespace std;

using ll = long long;

const int N=1e5+5;
const int Q=3e5+5;
const int LG=17;
const ll INF=1e18;

int n,t,q;
int m[N];
vector<int> a[N],b[N];
vector<pair<int,ll>> dp[LG][N];
vector<pair<int,ll>> cost[N];
vector<pair<int,int>> qr[N];
ll ans[Q];
int lg[N];

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> t;
    for(int i=1;i<n;i++){
        int k;
        cin >> k;
        vector<pair<int,int>> res(k);
        for(auto &[l,r]:res)cin >> l >> r;
        sort(res.begin(),res.end(),[&](pair<int,int> x,pair<int,int> y){
            return x.first>y.first||(x.first==y.first&&y.second<x.second);
        });
        int mn=t;
        for(auto [l,r]:res){
            if(r>=mn)continue;
            mn=r;
            a[i].emplace_back(l);
            b[i].emplace_back(r);
            m[i]++;
        }
        reverse(a[i].begin(),a[i].end());
        reverse(b[i].begin(),b[i].end());
    }
    cin >> q;
    for(int i=1;i<=q;i++){
        int l,r;
        cin >> l >> r;
        qr[l].emplace_back(r,i);
        ans[i]=INF;
    }
    for(int i=1;i<n;i++){
        for(int j=0;j<LG;j++)dp[j][i].resize(m[i]);
        cost[i+1].resize(m[i]);
        for(int j=0;j<m[i];j++){
            dp[0][i][j]={j,b[i][j]-a[i][j]};
            cerr << i << "," << j << " : (" << j << "," << b[i][j]-a[i][j] << ")\n";
            if(i==n-1)continue;
            auto it=lower_bound(a[i+1].begin(),a[i+1].end(),b[i][j]);
            if(it==a[i+1].end()){
                cost[i+1][j]={0,a[i+1][0]+t-b[i][j]};
            }else{
                cost[i+1][j]={it-a[i+1].begin(),*it-b[i][j]};
            }
        }
    }
    for(int s=1;s<LG;s++){
        cerr << "--- " << (1<<s) << " ---\n";
        for(int i=1;i<n;i++){
            if(i+(1<<s)>n)break;
            for(int j=0;j<m[i];j++){
                auto [p,w]=dp[s-1][i][j];
                int x=i+(1<<(s-1));
                w+=cost[x][p].second;
                p=cost[x][p].first;
                w+=dp[s-1][x][p].second;
                p=dp[s-1][x][p].first;
                dp[s][i][j]={p,w};
                cerr << i << "," << j << " : (" << p << "," << w << ")\n";
            }
        }
    }
    lg[0]=-1,lg[1]=0;
    for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
    for(int l=1;l<=n;l++){
        sort(qr[l].begin(),qr[l].end());
        map<int,ll> pt;
        ll res=INF;
        for(int j=0;j<m[l];j++){
            pt[dp[0][l][j].first]=dp[0][l][j].second;
            res=min(res,dp[0][l][j].second);
        }
        int pre=l+1;
        for(auto [r,i]:qr[l]){
            if(r>pre){
                res=INF;
                map<int,ll> npt;
                for(auto [_p,_w]:pt){
                    int x=pre,p=_p;
                    ll w=_w;
                    for(int s=lg[r-x];s>=0;s--){
                        int tar=x+(1<<s);
                        if(tar>r)continue;
                        cerr << x << "," << p << " -> ";
                        w+=cost[x][p].second;
                        p=cost[x][p].first;
                        w+=dp[s][x][p].second;
                        p=dp[s][x][p].first;
                        cerr << tar << "," << p << "\n";
                        x=tar;
                    }
                    auto it=npt.find(p);
                    if(it==npt.end())npt[p]=w;
                    else it->second=min(it->second,w);
                    res=min(res,w);
                }
                swap(pt,npt);
                pre=r;
            }
            ans[i]=min(ans[i],res);
        }
    }
    for(int i=1;i<=q;i++)cout << ans[i] << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...