Submission #373490

#TimeUsernameProblemLanguageResultExecution timeMemory
373490SorahISASnowball (JOI21_ho_t2)C++17
100 / 100
118 ms11756 KiB
#pragma GCC optimize("Ofast", "unroll-loops")
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define double long double
using pii = pair<int, int>;
template<typename T>
using Prior = std::priority_queue<T>;
template<typename T>
using prior = std::priority_queue<T, vector<T>, greater<T>>;

#define X first
#define Y second
#define eb emplace_back
#define ALL(x) begin(x), end(x)
#define RALL(x) rbegin(x), rend(x)
#define fastIO() ios_base::sync_with_stdio(0), cin.tie(0)

template<class T1, class T2>
inline ostream& operator << (ostream& os, pair<T1, T2> p) {
    os << "(" << p.X << "," << p.Y << ")";
    return os;
}

template<class T>
inline ostream& operator << (ostream& os, vector<T> vec) {
    for (auto x : vec) os << x << " ";
    return os;
}

void solve() {
    int n, q; cin >> n >> q;
    
    vector<int> pl(n), wind(q);
    for (auto &x : pl) cin >> x;
    for (auto &x : wind) cin >> x;
    
    vector<pii> maxLR(q+1);
    for (int i = 0, p = 0; i < q; ++i) {
        p += wind[i];
        maxLR[i+1].X = max(maxLR[i].X, -p);
        maxLR[i+1].Y = max(maxLR[i].Y,  p);
    }
    // cout << maxLR << "\n";
    
    vector<pii> snow(n);
    for (int i = 0; i < n-1; ++i) {
        int dist = pl[i+1] - pl[i], lo = 0, hi = q, mi;
        while (lo < hi) {
            mi = lo + hi + 1 >> 1;
            if (maxLR[mi].X + maxLR[mi].Y > dist) hi = mi - 1;
            else lo = mi;
        }
        // cout << dist << " " << lo << "\n";
        if (lo == q) {
            snow[i+1].X = maxLR.back().X;
            snow[i].Y   = maxLR.back().Y;
        }
        else if (maxLR[lo+1].X > maxLR[lo].X) {
            snow[i+1].X = dist - maxLR[lo].Y;
            snow[i].Y   = maxLR[lo].Y;
        }
        else if (maxLR[lo+1].Y > maxLR[lo].Y) {
            snow[i+1].X = maxLR[lo].X;
            snow[i].Y   = dist - maxLR[lo].X;
        }
        // else assert(0);
    }
    snow[0].X = maxLR.back().X, snow[n-1].Y = maxLR.back().Y;
    // cout << snow << "\n";
    
    for (int i = 0; i < n; ++i) cout << snow[i].X + snow[i].Y << "\n";
}

int32_t main() {
    fastIO();
    
    int t = 1; // cin >> t;
    while (t--) solve();
    
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void solve()':
Main.cpp:51:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |             mi = lo + hi + 1 >> 1;
      |                  ~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...