Submission #1187932

#TimeUsernameProblemLanguageResultExecution timeMemory
1187932dragstEscape Route 2 (JOI24_escape2)C++20
0 / 100
3093 ms31760 KiB
#include <bits/stdc++.h>
#define pll pair<long long, long long>
using namespace std;

struct thing
{
    long long nxt, day;
};

thing jump[100005][20], p;
long long l[100005], r[100005], id[100005], mn[100005];
pll a[100005];

bool sortt(long long x, long long y) {return a[x]<a[y];}

bool sorttt(long long x, long long y) {return a[x].second<a[y].second;}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    long long n, T, q, i, j, k=1, h;
    cin >> n >> T;
    for (i=1; i<n; i++)
    {
        cin >> j;
        l[i]=r[i-1]+1; r[i]=l[i]+j-1; h=T-1;
        while (j--)
        {
            cin >> a[k].first >> a[k].second;
            if (a[k].second<h) {mn[i]=k; h=a[k].second;};
            id[k]=k; k++;
        };
    };
    for (i=n-1; i>=1; i--)
    {
        if (i<n-1) {sort(id+l[i+1], id+r[i+1]+1, sortt);}
        else {continue;};
        sort(id+l[i], id+r[i]+1, sorttt);
        k=r[i+1]; p={mn[i+1], 1LL};
        for (j=r[i]; j>=l[i]; j--)
        {
            while (k>=l[i+1] && a[id[k]].first>=a[id[j]].second)
            {
                if (p.day==1) {p={id[k], 0LL};}
                else if (a[id[k]].second<a[p.nxt].second) {p={id[k], p.day};};
                k--;
            };
            jump[id[j]][0]=p;
            for (h=1; i+(1LL<<h)<n; h++)
            {
                jump[id[j]][h]={jump[jump[id[j]][h-1].nxt][h-1].nxt, jump[id[j]][h-1].day+jump[jump[id[j]][h-1].nxt][h-1].day};
            };
        };
    };
    cin >> q;
    while (q--)
    {
        cin >> i >> j;
        long long ans=T*n;
        k=j-i-1;
        for (long long x=l[i]; x<=r[i]; x++)
        {
            thing xx={x, 0LL};
            for (h=0; (1LL<<h)<=k; h++)
            {
                if (k&(1LL<<h)) {xx={jump[xx.nxt][h].nxt, xx.day+jump[xx.nxt][h].day};};
            };
            ans=min(ans, a[xx.nxt].second-a[x].first+T*xx.day);
        };
        cout << ans << "\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...