Submission #1117375

#TimeUsernameProblemLanguageResultExecution timeMemory
1117375_callmelucianEscape Route 2 (JOI24_escape2)C++14
100 / 100
592 ms129392 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pl;
typedef pair<int,int> pii;
typedef tuple<int,int,int> tpl;

#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())

const int mn = 1e5 + 5, Q = 3e5 + 5;
//const int limFlight = 10, limQuery = 10;
const int limFlight = 316, limQuery = 1000;

vector<pl> flight[mn], nxt[18][mn], qry[mn];
vector<ll> save[mn];
ll best[mn], ans[Q], n, T;

void refine (vector<pl> &vec) {
    priority_queue<pl> pq;
    sort(all(vec), [&] (pl a, pl b)
         { return (a.first == b.first ? a.second > b.second : a.first < b.first); });

    for (pl item : vec) {
        ll a, b; tie(a, b) = item;
        while (pq.size() && pq.top().first >= b) pq.pop();
        pq.emplace(b, a);
    }
    vec.clear();

    while (pq.size()) {
        ll a, b; tie(b, a) = pq.top(); pq.pop();
        vec.emplace_back(a, b);
    }
    reverse(all(vec));
}

ll quickJump (int u, int flightID, int step) {
    ll ans = 0;
    for (int i = 0; step; step >>= 1, i++) {
        if ((step & 1) == 0) continue;
        ll weight; tie(flightID, weight) = nxt[i][u][flightID];
        u += (1 << i), ans += weight;
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    /// read flights info
    cin >> n >> T;
    for (int i = 1; i < n; i++) {
        int m; cin >> m;
        flight[i].resize(m);
        for (pl &it : flight[i])
            cin >> it.first >> it.second;
        refine(flight[i]);
        assert(flight[i].size());
    }

    for (int s = 0; s < 18; s++)
        for (int i = 1; i < n; i++) nxt[s][i].resize(flight[i].size());

    /// construct edges + bin-lift pre-compute
    for (int i = 1; i + 1 < n; i++) {
        int iter = 0;
        for (int j = 0; j < flight[i].size(); j++) {
            while (iter < flight[i + 1].size() && flight[i][j].second > flight[i + 1][iter].first) iter++;
            if (iter < flight[i + 1].size())
                nxt[0][i][j] = {iter, flight[i + 1][iter].second - flight[i][j].second};
            else nxt[0][i][j] = {0, flight[i + 1][0].second + T - flight[i][j].second};

//            cout << "(" << i << ", " << j << ") -> (" << i + 1 << ", " << nxt[0][i][j].first << "), weight " << nxt[0][i][j].second << "\n";
        }
    }
    for (int s = 1; s < 18; s++) {
        for (int i = 1; i + (1 << s) < n; i++) {
            for (int j = 0; j < flight[i].size(); j++) {
                ll id, weight; tie(id, weight) = nxt[s - 1][i][j];
                ll nxtID, nxtWeight; tie(nxtID, nxtWeight) = nxt[s - 1][i + (1 << (s - 1))][id];
                nxt[s][i][j] = {nxtID, weight + nxtWeight};
            }
        }
    }

    /// read queries
    int q; cin >> q;
    for (int i = 0; i < q; i++) {
        int l, r; cin >> l >> r;
        qry[l].emplace_back(r, i);
    }

    /// process queries
    for (int i = 1; i < n; i++) {
        if (qry[i].empty()) continue;
        if (flight[i].size() > limFlight || qry[i].size() > limQuery) { // calculate for every possible R
            for (int j = i; j < n; j++) save[j] = vector<ll>(flight[j].size(), LLONG_MAX);
            for (int k = 0; k < flight[i].size(); k++)
                save[i][k] = flight[i][k].second - flight[i][k].first;
            for (int j = i; j + 1 < n; j++) {
                for (int k = 0; k < flight[j].size(); k++) {
                    if (save[j][k] == LLONG_MAX) continue;
                    ll nxtID, weight; tie(nxtID, weight) = nxt[0][j][k];
                    save[j + 1][nxtID] = min(save[j + 1][nxtID], save[j][k] + weight);
                }
            }
            for (int j = i; j < n; j++) best[j] = *min_element(all(save[j]));
            for (pii item : qry[i]) {
                int r, idx; tie(r, idx) = item;
                ans[idx] = best[r - 1];
            }
        }
        else { // simply brute-force
            for (pii item : qry[i]) {
                int r, idx; tie(r, idx) = item;
                ans[idx] = LLONG_MAX;
                for (int k = 0; k < flight[i].size(); k++)
                    ans[idx] = min(ans[idx], quickJump(i, k, r - i - 1) + flight[i][k].second - flight[i][k].first);
            }
        }
    }
    for (int i = 0; i < q; i++) cout << ans[i] << "\n";

    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:72:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |         for (int j = 0; j < flight[i].size(); j++) {
      |                         ~~^~~~~~~~~~~~~~~~~~
Main.cpp:73:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |             while (iter < flight[i + 1].size() && flight[i][j].second > flight[i + 1][iter].first) iter++;
      |                    ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:74:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |             if (iter < flight[i + 1].size())
      |                 ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:83:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |             for (int j = 0; j < flight[i].size(); j++) {
      |                             ~~^~~~~~~~~~~~~~~~~~
Main.cpp:103:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |             for (int k = 0; k < flight[i].size(); k++)
      |                             ~~^~~~~~~~~~~~~~~~~~
Main.cpp:106:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |                 for (int k = 0; k < flight[j].size(); k++) {
      |                                 ~~^~~~~~~~~~~~~~~~~~
Main.cpp:122:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |                 for (int k = 0; k < flight[i].size(); k++)
      |                                 ~~^~~~~~~~~~~~~~~~~~
#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...