Submission #1242003

#TimeUsernameProblemLanguageResultExecution timeMemory
1242003GeforgsRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
800 ms162108 KiB
#include <iostream> #include <iomanip> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <queue> #include <map> #include <unordered_map> #include <stack> #include <bitset> #include <string> #include <cstring> #include <iterator> #include <random> #define ll long long #define ld long double #define inf (ll)(2*1e18) #define sort(a) sort(a.begin(), a.end()) #define reverse(a) reverse(a.begin(), a.end()) #define pb push_back #define endl "\n" using namespace std; const ll dim=22; void build(ll id, ll l, ll r, vector<pair<ll, ll>>& a, vector<pair<ll, ll>>& b){ if(l == r){ b[id] = a[l]; return; } ll m=(l+r)/2; build(2*id, l, m, a, b); build(2*id+1, m+1, r, a, b); b[id].first = min(b[2*id].first, b[2*id+1].first); b[id].second = max(b[2*id].second, b[2*id+1].second); } pair<ll, ll> get(ll id, ll l, ll r, ll tl, ll tr, vector<pair<ll, ll>>& b){ if(r < tl or tr < l) return {inf, -inf}; if(tl <= l and r <= tr){ return b[id]; } ll m=(l+r)/2; pair<ll, ll> res1, res2; res1 = get(2*id, l, m, tl, tr, b); res2 = get(2*id+1, m+1, r, tl, tr, b); return {min(res1.first, res2.first), max(res1.second, res2.second)}; } ll find(ll x, ll y, ll n, vector<vector<pair<ll, ll>>>& b){ pair<ll, ll> res=get(1, 0, n-1, x, x, b[dim-1]); ll ans=0, l=x, r=x; if(y < res.first or res.second < y) return -1; for(int i=dim-1;i>=0;--i){ res = get(1, 0, n-1, l, r, b[i]); if(y < res.first or res.second < y){ ans += (1<<i); l = res.first; r = res.second; } } return ans+1; } void solve(){ ll n, k, m, q, i, j, x, y; cin>>n>>k>>m; vector<vector<ll>> addA(n); vector<vector<ll>> delA(n); vector<vector<ll>> addB(n); vector<vector<ll>> delB(n); vector<pair<ll, ll>> a(n); multiset<ll> s; vector<vector<pair<ll, ll>>> b(dim, vector<pair<ll, ll>>(4*n)); for(i=0;i<m;++i){ cin>>x>>y; --x; --y; if(x < y){ addA[x].pb(y); delA[min(x + k - 1, y - 1)].pb(y); }else{ addB[x].pb(y); delB[max(x - k + 1, y + 1)].pb(y); } } for(i=0;i<n;++i){ a[i] = {i, i}; for(auto el: addA[i]){ s.insert(el); } if(!s.empty()){ a[i].second = max(*s.rbegin(), a[i].second); } for(auto el: delA[i]){ s.erase(s.find(el)); } } for(i=n-1;i>=0;--i){ for(auto el: addB[i]){ s.insert(el); } if(!s.empty()){ a[i].first = min(*s.begin(), a[i].first); } for(auto el: delB[i]){ s.erase(s.find(el)); } } for(i=0;i<dim;++i){ build(1, 0, n-1, a, b[i]); for(j=0;j<n;++j){ a[j] = get(1, 0, n-1, a[j].first, a[j].second, b[i]); } } cin>>q; for(i=0;i<q;++i){ cin>>x>>y; --x; --y; cout<<find(x, y, n,b)<<endl; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); srand(time(nullptr)); ll t=1; // cin>>t; for(;t>0;--t){ solve(); } 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...