Submission #1093443

#TimeUsernameProblemLanguageResultExecution timeMemory
1093443TymondFire (BOI24_fire)C++17
100 / 100
216 ms50916 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; #define fi first #define se second #define vi vector<int> #define vll vector<long long> #define pii pair<int, int> #define pll pair<long long, long long> #define pb push_back #define mp make_pair #define eb emplace_back #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count()); inline int rand(int l,int r){return uniform_int_distribution<int>(l, r)(rng);} inline ll rand(ll l,ll r){return uniform_int_distribution<ll>(l, r)(rng64);} #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif struct custom_hash { static uint64_t splitmix64(uint64_t x) { x += 0x9e3779b97f4a7c15; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9; x = (x ^ (x >> 27)) * 0x94d049bb133111eb; return x ^ (x >> 31); } size_t operator()(uint64_t x) const { static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); return splitmix64(x + FIXED_RANDOM); } }; struct Info{ ll ind, blokSz, blokMod, val; Info(ll nind, ll nb, ll nm, ll nv){ ind = nind; blokSz = nb; blokMod = nm; val = nv; } }; const int MAXN = 5e5 + 7; const int MAXK = 20; const int BASE = (1 << 19); pii tree[2 * BASE + 7]; int p[MAXN]; int e[MAXN]; int nxt[MAXN]; int jump[MAXK][MAXN]; pii mx[MAXN]; int n, m; void init(){ for(int i = 1; i <= n; i++){ tree[i + BASE] = {e[i], i}; } for(int i = BASE - 1; i >= 1; i--){ if(tree[2 * i].fi >= tree[2 * i + 1].fi){ tree[i] = tree[2 * i]; }else{ tree[i] = tree[2 * i + 1]; } } } pii query(int v, int l, int r, int a, int b){ if(r < a || b < l){ return mp(0, 0); } if(a <= l && r <= b){ return tree[v]; } int mid = (l + r) / 2; pii r1 = query(2 * v, l, mid, a, b); pii r2 = query(2 * v + 1, mid + 1, r, a, b); if(r1.fi >= r2.fi){ return r1; } return r2; } int main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; vector<pii> vec; for(int i = 1; i <= n; i++){ cin >> p[i] >> e[i]; if(p[i] < e[i]){ vec.pb({p[i], e[i]}); vec.pb({p[i] + m, e[i] + m}); }else{ vec.pb({p[i], e[i] + m}); vec.pb({p[i] + m, e[i] + 2 * m}); } } n *= 2; sort(all(vec)); //cerr << sz(vec) << ' ' << n << '\n'; for(int i = 1; i <= n; i++){ p[i] = vec[i - 1].fi; e[i] = vec[i - 1].se; } //cerr << "NIGGA\n"; init(); nxt[n] = n; /*cout << "-------\n"; for(int i = 1; i <= n; i++){ cout << p[i] << ' ' << e[i] << '\n'; }*/ for(int i = n - 1; i >= 1; i--){ if(p[i + 1] > e[i]){ nxt[i] = i; continue; } //cout << "----\n"; int l = i + 1; int hi = n; int s; while(l < hi){ //cout << l << ' ' << hi << '\n'; s = (l + hi + 1) / 2; if(p[s] <= e[i]){ l = s; }else{ hi = s - 1; } } //cout<< i << ' ' << l << '\n'; pii r = query(1, 0, BASE - 1, i + 1, l); nxt[i] = r.se; } for(int i = 1; i <= n; i++){ jump[0][i] = nxt[i]; } for(int j = 1; j < MAXK; j++){ for(int i = 1; i <= n; i++){ jump[j][i] = jump[j - 1][jump[j - 1][i]]; } } // cout << "----\n"; int ans = (int)1e9; for(int i = 1; i <= n; i++){ if(e[jump[MAXK - 1][i]] - p[i] < m){ continue; } //cout << "--\n"; //cout << i << ' ' << nxt[i] << '\n'; int r = 1; int v = i; for(int j = MAXK - 1; j >= 0; j--){ if(e[jump[j][v]] - p[i] < m){ r += (1 << j); v = jump[j][v]; } } r++; //cout << v << ' ' << r<< '\n'; ans = min(ans, r); } if(ans == (int)1e9){ cout << -1 << '\n'; }else{ cout << ans << '\n'; } return 0; }
#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...