Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- #define int long long
- #define pb push_back
- #define mp make_pair
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
- #pragma GCC target("avx,avx2")
- constexpr int INF = (int)4e18;
- constexpr int N = (int)1e6 + 11;
- constexpr int MAXN = (int)1e5 + 11;
- constexpr int md = (int)998244353;
- mt19937_64 rnd(std::chrono::steady_clock().now().time_since_epoch().count());
- struct edge{
- int id,x,d,t,p;
- edge(){}
- edge(int id,int x,int d,int t,int p):id(id),x(x),d(d),t(t),p(p){}
- };
- void solve(){
- int n,L;
- cin >> n >> L;
- map<int,vector<edge>> g;
- map<int,int> d;
- map<int,pair<int,int>> pr;
- d[0] = 0;
- for(int i = 0; i < n; i++){
- int x,di,t,p;
- cin >> x >> di >> t >> p;
- if(x - p < 0)
- continue;
- g[x-p].pb({i+1,x,di,t,p});
- d[x-p] = INF;
- d[x+di] = INF;
- }
- d[0] = 0;
- d[L] = INF;
- int mn = 0;
- int prevX = 0;
- set<pair<pair<int,int>,pair<int,int>>> st; /// d[x]+x,prX-p,prX+d,id
- map<int,vector<pair<pair<int,int>,pair<int,int>>>> toDelete;
- for(auto&[x,y] : d){
- for(auto& p : toDelete[x])
- st.erase(p);
- if(!st.empty() && d[x] > st.begin()->first.first - x){
- d[x] = st.begin()->first.first - x;
- pr[x] = mp(st.begin()->first.second,st.begin()->second.second);
- }
- if(d[x] > mn + x){
- d[x] = mn + x;
- pr[x] = mp(prevX,-1);
- }
- if(mn > d[x]-x){
- prevX = x;
- mn = d[x] - x;
- }
- for(auto& e : g[x]){
- int to = e.x + e.d;
- int t = e.t;
- int id = e.id;
- int jump = e.x;
- int p = e.p;
- if(d[to] > d[x]+p+t){
- d[to] = d[x]+p+t;
- pr[to] = mp(x,id);
- st.insert(mp(mp(d[to]+to,x),mp(to,id)));
- toDelete[to].pb(mp(mp(d[to]+to,x),mp(to,id)));
- }
- }
- }
- cout << d[L] << "\n";
- vector<int> trampoline;
- int y = L;
- while(y > 0){
- int t = pr[y].second;
- if(t != -1)
- trampoline.pb(t);
- y = pr[y].first;
- }
- reverse(trampoline.begin(),trampoline.end());
- cout << trampoline.size() << "\n";
- for(auto& x : trampoline)
- cout << x << " ";
- return;
- }
- signed main(){
- ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
- int tests = 1;
- // cin >> tests;
- while(tests--){
- solve();
- }
- }
- /**
- **/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement