Submission #543453

#TimeUsernameProblemLanguageResultExecution timeMemory
543453SmolBrainFuel Station (NOI20_fuelstation)C++17
20 / 100
389 ms52036 KiB
// Om Namah Shivaya // GM in 125 days #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define endl '\n' #define pb push_back #define conts continue #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "YES" << endl #define no cout << "NO" << endl #define ff first #define ss second #define ceil2(x,y) ((x+y-1) / (y)) #define sz(a) a.size() #define setbits(x) __builtin_popcountll(x) #ifndef ONLINE_JUDGE #define debug(x) cout << #x <<" = "; print(x); cout << endl #else #define debug(x) #endif #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) bool iseven(ll n) {if ((n & 1) == 0) return true; return false;} void print(ll t) {cout << t;} void print(int t) {cout << t;} void print(string t) {cout << t;} void print(char t) {cout << t;} void print(double t) {cout << t;} void print(ld t) {cout << t;} template <class T, class V> void print(pair <T, V> p); template <class T> void print(vector <T> v); template <class T> void print(set <T> v); template <class T, class V> void print(map <T, V> v); template <class T> void print(multiset <T> v); template <class T, class V> void print(pair <T, V> p) {cout << "{"; print(p.ff); cout << ","; print(p.ss); cout << "}";} template <class T> void print(vector <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";} template <class T> void print(set <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";} template <class T> void print(multiset <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";} template <class T, class V> void print(map <T, V> v) {cout << "[ "; for (auto i : v) {print(i); cout << " ";} cout << "]";} template<typename T> void amin(T &a, T b) { a = min(a, b); } template<typename T> void amax(T &a, T b) { a = max(a, b); } void usaco(string filename) { freopen((filename + ".in").c_str(), "r", stdin); freopen((filename + ".out").c_str(), "w", stdout); } const int MOD = 1e9 + 7; const int maxn = 1e5 + 5; const int inf1 = 1e9 + 5; const ll inf2 = ll(1e18) + 5; template<typename T> struct segtree { /*=======================================================*/ struct data { ll sum, mnpref; }; data neutral = {0, inf2}; void merge(data &curr, data &left, data &right) { curr.sum = left.sum + right.sum; curr.mnpref = min(left.mnpref, left.sum + right.mnpref); } void create(int x, int lx, int rx, T v) { tr[x] = {v, v}; } void modify(int x, int lx, int rx, T v) { tr[x].sum += v; tr[x].mnpref = tr[x].sum; } /*=======================================================*/ int siz = 1; vector<data> tr; segtree(int n) { init(n); } segtree() { }; void init(int n) { while (siz < n) siz *= 2; tr.assign(2 * siz, neutral); } void build(vector<T> &a, int n, int x, int lx, int rx) { if (rx - lx == 1) { if (lx < n) { create(x, lx, rx, a[lx]); } return; } int mid = (lx + rx) / 2; build(a, n, 2 * x + 1, lx, mid); build(a, n, 2 * x + 2, mid, rx); merge(tr[x], tr[2 * x + 1], tr[2 * x + 2]); } void build(vector<T> &a, int n) { build(a, n, 0, 0, siz); } void pupd(int i, T v, int x, int lx, int rx) { if (rx - lx == 1) { modify(x, lx, rx, v); return; } int mid = (lx + rx) / 2; if (i < mid) { pupd(i, v, 2 * x + 1, lx, mid); } else { pupd(i, v, 2 * x + 2, mid, rx); } merge(tr[x], tr[2 * x + 1], tr[2 * x + 2]); } void pupd(int i, T v) { pupd(i, v, 0, 0, siz); } data query(int l, int r, int x, int lx, int rx) { if (lx >= r or rx <= l) return neutral; if (lx >= l and rx <= r) return tr[x]; int mid = (lx + rx) / 2; data curr; data left = query(l, r, 2 * x + 1, lx, mid); data right = query(l, r, 2 * x + 2, mid, rx); merge(curr, left, right); return curr; } data query(int l, int r) { return query(l, r + 1, 0, 0, siz); } }; void solve(int test_case) { ll n, d; cin >> n >> d; vector<array<ll, 3>> a(n); rep(i, n) rep(j, 3) cin >> a[i][j]; sort(all(a)); vector<ll> diff(n + 5); diff[0] = a[0][0]; rep1(i, n - 1) diff[i] = a[i][0] - a[i - 1][0]; diff[n] = d - a[n - 1][0]; auto check = [&](ll f) { ll prev = 0, fuel = f; rep(i, n) { auto [x, add, mx] = a[i]; ll dis = x - prev; fuel -= dis; if (fuel < 0) { return false; } if (f <= mx) { fuel += add; } prev = x; } ll dis = d - prev; fuel -= dis; if (fuel < 0) return false; return true; }; vector<ll> b(n); rep(i, n) b[i] = a[i][0]; sort(all(b)); auto it = unique(all(b)); b.resize(it - b.begin()); segtree<ll> st(2 * n + 5); rep(i, n + 1) { ll x = a[i][0]; x = lower_bound(all(b), x) - b.begin() + 1; st.pupd(2 * x, -diff[i]); } ll ans = d; vector<array<ll, 3>> c(n); rep(i, n) { auto [x, toadd, mx] = a[i]; x = lower_bound(all(b), x) - b.begin() + 1; c[i] = {mx, x, toadd}; } sort(rall(c)); ll l = -1, r = -2; rep(i, n) { auto [mx, x, toadd] = c[i]; st.pupd(2 * x + 1, toadd); ll f = mx; st.pupd(0, f); ll mnpref = st.query(0, 2 * n + 2).mnpref; if (mnpref >= 0) { if (i + 1 < n) { l = c[i + 1][0] + 1; } else { l = 1; } r = f; amin(ans, f); } st.pupd(0, -f); } while (l <= r) { ll mid = (l + r) / 2; if (check(mid)) { amin(ans, mid); r = mid - 1; } else { l = mid + 1; } } l = c[0][0] + 1, r = d; while (l <= r) { ll mid = (l + r) / 2; if (check(mid)) { amin(ans, mid); r = mid - 1; } else { l = mid + 1; } } l = 1, r = c.back()[0]; while (l <= r) { ll mid = (l + r) / 2; if (check(mid)) { amin(ans, mid); r = mid - 1; } else { l = mid + 1; } } cout << ans << endl; } int main() { fastio; int t = 1; // cin >> t; rep1(i, t) { solve(i); } return 0; }

Compilation message (stderr)

FuelStation.cpp: In function 'void usaco(std::string)':
FuelStation.cpp:64:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     freopen((filename + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FuelStation.cpp:65:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |     freopen((filename + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...