Submission #987782

# Submission time Handle Problem Language Result Execution time Memory
987782 2024-05-23T15:05:14 Z _callmelucian Snowball (JOI21_ho_t2) C++14
33 / 100
2500 ms 31368 KB
#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> tt;

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

const int mn = 2e5 + 5;
ll x[mn], pre[mn], ansLeft[mn], ansRight[mn];

void solve (vector<pl> &query, vector<pl> &vec, vector<int> &ans) {
    int it = -1, curAns = INT_MAX;
    for (auto [ub, iQry] : query) {
        while (it + 1 < vec.size() && vec[it + 1].first <= ub)
            curAns = min(curAns, (int)vec[++it].second);
        ans[iQry] = curAns;
    }
}

/*
    main idea: binary search, for every snowball,
    find the nearest position to its right
    such that this snowball reaches that point
    before the snowball right next to it.

    at first glance, time complexity is O(2e5 log 1e12 log 2e5)
    batch process all snowballs for O(2e5 log 1e12) time complexity
*/

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

    int n, q; cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> x[i];

    vector<pl> lVec, rVec;

    lVec.push_back({0, 0});
    rVec.push_back({0, 0});
    for (int i = 1; i <= q; i++) {
        ll w; cin >> w;
        pre[i] = pre[i - 1] + w;
        lVec.push_back({pre[i], i});
        rVec.push_back({-pre[i], i});
    }
    sort(all(lVec)); sort(all(rVec));

    /// process left side
    for (ll mask = (1LL << 57); mask; mask >>= 1) {
        vector<pl> lQuery, rQuery;
        vector<int> lAns(n + 1), rAns(n + 1);

        for (int i = 1; i <= n; i++) {
            ll tmp = ansLeft[i] | mask;
            // find the soonest wind for it to reach somewhere <= x[i] - tmp
            lQuery.push_back({-tmp, i});
            if (i > 1) {
                // find the soonest wind for it to reach somewhere >= x[i] - tmp + 1
                ll dest = x[i] - tmp + 1;
                rQuery.push_back({-(dest - x[i - 1]), i - 1});
            }
        }
        sort(all(lQuery)); sort(all(rQuery));

        solve(lQuery, lVec, lAns);
        solve(rQuery, rVec, rAns);

        for (int i = 1; i <= n; i++) {
            if (i == 1) {
                if (lAns[i] != INT_MAX) ansLeft[i] |= mask;
            }
            else {
                if (lAns[i] < rAns[i - 1]) ansLeft[i] |= mask;
            }
        }
    }

    /// process right side
    for (ll mask = (1LL << 57); mask; mask >>= 1) {
        vector<pl> lQuery, rQuery;
        vector<int> lAns(n + 1), rAns(n + 1);

        for (int i = 1; i <= n; i++) {
            ll tmp = ansRight[i] | mask;
            // find the soonest wind for it to reach somewhere >= x[i] + tmp
            rQuery.push_back({-tmp, i});
            if (i < n) {
                // find the soonest wind for it to reach somewhere <= x[i] + tmp - 1
                ll dest = x[i] + tmp - 1;
                lQuery.push_back({dest - x[i + 1], i + 1});
            }
        }
        sort(all(lQuery)); sort(all(rQuery));

        solve(lQuery, lVec, lAns);
        solve(rQuery, rVec, rAns);

        for (int i = 1; i <= n; i++) {
            if (i == n) {
                if (rAns[i] != INT_MAX) ansRight[i] |= mask;
            }
            else {
                if (rAns[i] < lAns[i + 1]) ansRight[i] |= mask;
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        //cout << ansLeft[i] << " " << ansRight[i] << " ";
        cout << ansRight[i] + ansLeft[i] << "\n";
    }

    return 0;
}

Compilation message

Main.cpp: In function 'void solve(std::vector<std::pair<long long int, long long int> >&, std::vector<std::pair<long long int, long long int> >&, std::vector<int>&)':
Main.cpp:18:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   18 |     for (auto [ub, iQry] : query) {
      |               ^
Main.cpp:19:23: 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]
   19 |         while (it + 1 < vec.size() && vec[it + 1].first <= ub)
      |                ~~~~~~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 600 KB Output is correct
2 Correct 1 ms 612 KB Output is correct
3 Correct 3 ms 604 KB Output is correct
4 Correct 29 ms 776 KB Output is correct
5 Correct 25 ms 600 KB Output is correct
6 Correct 26 ms 604 KB Output is correct
7 Correct 23 ms 604 KB Output is correct
8 Correct 23 ms 604 KB Output is correct
9 Correct 26 ms 756 KB Output is correct
10 Correct 24 ms 856 KB Output is correct
11 Correct 14 ms 604 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 3 ms 348 KB Output is correct
15 Correct 27 ms 772 KB Output is correct
16 Correct 28 ms 604 KB Output is correct
17 Correct 29 ms 600 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 22 ms 604 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 600 KB Output is correct
2 Correct 1 ms 612 KB Output is correct
3 Correct 3 ms 604 KB Output is correct
4 Correct 29 ms 776 KB Output is correct
5 Correct 25 ms 600 KB Output is correct
6 Correct 26 ms 604 KB Output is correct
7 Correct 23 ms 604 KB Output is correct
8 Correct 23 ms 604 KB Output is correct
9 Correct 26 ms 756 KB Output is correct
10 Correct 24 ms 856 KB Output is correct
11 Correct 14 ms 604 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 3 ms 348 KB Output is correct
15 Correct 27 ms 772 KB Output is correct
16 Correct 28 ms 604 KB Output is correct
17 Correct 29 ms 600 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 22 ms 604 KB Output is correct
20 Correct 63 ms 12472 KB Output is correct
21 Correct 65 ms 11452 KB Output is correct
22 Correct 74 ms 12212 KB Output is correct
23 Correct 86 ms 10440 KB Output is correct
24 Correct 384 ms 12744 KB Output is correct
25 Execution timed out 2517 ms 31368 KB Time limit exceeded
26 Halted 0 ms 0 KB -