#include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; L c; cin >> n >> c; int d = 500001; V<V<int>> blocks(d); REP(i, n) { int a, w; cin >> a >> w; blocks[a].EB(w); } V<L> res(d); set<pair<L, int>> res_s; REP(i, d) { res_s.insert(MP(0LL, 0)); } REP(a, d) { V<pair<L, int>> new_res, old_res; for (int w : blocks[a]) { L r = max(res[w], prev(res_s.end())->ST - c) + a; new_res.EB(MP(r, w)); old_res.EB(MP(res[w], w)); } REP(i, int(new_res.size())) { auto& [r, w] = new_res[i]; res[w] = r; res_s.erase(old_res[i]); res_s.insert(MP(r, w)); } } cout << prev(res_s.end())->ST << '\n'; } // g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 wie.cpp -o wie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; L c; cin >> n >> c; int d = 500001; V<V<int>> blocks(d); REP(i, n) { int a, w; cin >> a >> w; blocks[a].EB(w); } V<L> res(d); set<pair<L, int>> res_s; REP(i, d) { res_s.insert(MP(0LL, 0)); } REP(a, d) { V<pair<L, int>> new_res, old_res; for (int w : blocks[a]) { L r = max(res[w], prev(res_s.end())->ST - c) + a; new_res.EB(MP(r, w)); old_res.EB(MP(res[w], w)); } REP(i, int(new_res.size())) { auto& [r, w] = new_res[i]; res[w] = r; res_s.erase(old_res[i]); res_s.insert(MP(r, w)); } } cout << prev(res_s.end())->ST << '\n'; } // g++ -std=c++20 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG -O3 wie.cpp -o wie |