Submission #730876

#TimeUsernameProblemLanguageResultExecution timeMemory
730876groguPassport (JOI23_passport)C++14
16 / 100
963 ms439492 KiB
#define here cerr<<"===========================================\n" #define dbg(x) cerr<<#x<<": "<<x<<endl; #include <bits/stdc++.h> #define ld double #define ll long long #define ull unsigned long long #define llinf 100000000000000000LL // 10^17 #define iinf 2000000000 // 2*10^9 #define pb push_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pii pair<int,int> #define pll pair<ll,ll> #define pld pair<ld,ld> #define all(a) a.begin(),a.end() using namespace std; #define maxn 2505 #define lg 13 ll n,q; pll a[maxn]; vector<pll> g[maxn*maxn]; ll dis[maxn*maxn]; ll lg2[maxn]; pll st[lg][maxn]; ll st2[lg][maxn]; ll kod(pll p){return p.fi*(n+1) + p.sc;} pll rev(ll x){return {x/(n+1),x%(n+1)};} void upd(ll x,ll y,ll w){ g[x].pb({y,w}); //cerr<<rev(x).fi<< " "<<rev(x).sc<< " "<<rev(y).fi<< " "<<rev(y).sc<<endl; } void getdis(ll poc){ for(ll i = 1;i<maxn*maxn;i++) dis[i] = llinf; dis[poc] = 0; priority_queue<pll> pq; pq.push({0,poc}); while(pq.size()){ pll p = pq.top(); ll u = p.sc; ll cur = -p.fi; pq.pop(); if(cur!=dis[u]) continue; for(pll p : g[u]){ ll s = p.fi; ll w = p.sc; if(cur+w<dis[s]){ dis[s] = cur+w; pq.push({-dis[s],s}); } } } } ll mrg(ll x,ll y){ if(a[x].sc-a[x].fi>a[y].sc-a[y].fi) return x; return y; } pll mrg(pll p,pll q){ pll ans; if(a[p.fi].fi<a[q.fi].fi) ans.fi = p.fi; else if(a[p.fi].fi==a[q.fi].fi){ if(a[p.fi].sc>a[q.fi].sc) ans.fi = p.fi; else ans.fi = q.fi; }else ans.fi = q.fi; if(a[p.sc].sc>a[q.sc].sc) ans.sc = p.sc; else if(a[p.sc].sc==a[q.sc].sc){ if(a[p.sc].fi<a[q.sc].fi) ans.sc = p.sc; else ans.sc = q.sc; }else ans.sc = q.sc; return ans; } pair<pll,ll> get(ll l,ll r){ ll len = r-l+1; ll x = lg2[len]; ll len2 = (1<<x); pll p = st[x][l]; pll q = st[x][r-len2+1]; pll ans = mrg(p,q); ll px = st2[x][l]; ll py = st2[x][r-len2+1]; ll ansx = mrg(px,py); return {ans,ansx}; } int main(){ ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0); for(ll j = 0;j<lg;j++) lg2[(1<<j)] = j; for(ll j = 2;j<maxn;j++){ if(lg2[j]) continue; lg2[j] = lg2[j-1]; } cin >> n; for(ll i = 1;i<=n;i++){ cin >> a[i].fi >> a[i].sc; st[0][i] = {i,i}; st2[0][i] = i; } for(ll j = 1;j<lg;j++){ for(ll i = 1;i<=n;i++){ if(i+(1<<j)-1>n) continue; st[j][i] = mrg(st[j-1][i],st[j-1][i+(1<<(j-1))]); st2[j][i] = mrg(st2[j-1][i],st2[j-1][i+(1<<(j-1))]); } } for(ll len = 1;len<=n;len++){ for(ll i = 1;i+len-1<=n;i++){ ll l = i,r = i+len-1; pair<pll,ll> q = get(l,r); upd(kod({l,r}),kod(a[q.sc]),1); pll p = q.fi; upd(kod({l,r}),kod({a[p.fi].fi,max(r,a[p.fi].sc)}),1); upd(kod({l,r}),kod({min(l,a[p.sc].fi),a[p.sc].sc}),1); } } cin >> q; while(q--){ ll x; cin >> x; getdis(kod({x,x})); ll ans = dis[kod({1,n})]; if(ans==llinf) cout<<-1<<endl; else cout<<ans<<endl; } return 0; } /** 4 1 3 2 4 2 3 4 4 1 1 5 1 5 2 4 2 3 3 5 1 5 1 3 **/
#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...