제출 #1326929

#제출 시각아이디문제언어결과실행 시간메모리
1326929animal_migrationPassport (JOI23_passport)C++17
0 / 100
24 ms47252 KiB
#include <bits/stdc++.h> using namespace std; // #define int long long #define pii pair<int,int> #define fi first #define se second #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define pb push_back #define eb emplace_back #define rep(x,y,z) for (int x=y;x<z;x++) const int inf=1e9+7; const int mn=2e5+7; const int mm=2e6; vector<pii> G[mm]; int seg[mn*4]; int id=0; #define lc (i*2+1) #define rc (i*2+2) #define m ((l+r)/2) void bld(int i, int l, int r){ seg[i]=id++; if (l==r){ G[seg[i]].eb(l,0); return; } bld(lc,l,m); bld(rc,m+1,r); G[seg[i]].eb(seg[lc],0); G[seg[i]].eb(seg[rc],0); // cout<<seg[i]<<" -> "<<seg[lc]<<' '<<seg[rc]<<'\n'; } void add(int i, int l, int r, int ql, int qr, int x, int v){ if (l>qr||r<ql) return; if (ql<=l&&r<=qr){ G[x].eb(seg[i],v); return; } add(lc,l,m,ql,qr,x,v); add(rc,m+1,r,ql,qr,x,v); } #undef lc #undef rc #undef m void rrr(){ vector<vector<pii>> adj(id); rep(i,0,id){ for (auto [j,w]:G[i]){ adj[j].eb(i,w); } } rep(i,0,id){ // cout<<i<<": "; adj[i].swap(G[i]); // for (auto [j,w]:G[i]) cout<<j<<','<<w<<" "; // cout<<'\n'; } } void rmm(){ rep(i,0,id) vector<pii>().swap(G[i]); id=0; } void dij(int x, vector<bool> &vis, vector<int> &dis){ priority_queue<pii,vector<pii>,greater<pii>> que; que.push({0,x}); dis[x]=0; while (!que.empty()){ auto [d,u]=que.top(); // cout<<d<<' '<<u<<"*\n"; que.pop(); if (vis[u]) continue; vis[u]=1; // cout<<u<<": "<<dis[u]<<'\n'; for (auto [v,w]:G[u]){ if (dis[v]>dis[u]+w){ dis[v]=dis[u]+w; que.push({dis[v],v}); } } } } signed main(){ cin.tie(nullptr)->ios::sync_with_stdio(0); int n; cin>>n; vector<int> ll(n), rr(n); id=n; bld(0,0,n-1); rep(i,0,n){ cin>>ll[i]>>rr[i]; ll[i]--; rr[i]--; add(0,0,n-1,ll[i],rr[i],i,1); } rrr(); vector<int> d1(id,inf), d2(id,inf); vector<bool> v1(id,0), v2(id,0); dij(0,v1,d1); dij(n-1,v2,d2); rep(i,0,n){ // cout<<i<<": "<<d1[i]<<", "<<d2[i]<<'\n'; G[id].eb(i,d1[i]+d2[i]-1); } id++; vector<int> dis(id,inf); vector<bool> vis(id,0); dij(id-1,vis,dis); int q; cin>>q; while (q--){ int x; cin>>x; x--; cout<<(dis[x]>=inf-3?-1:dis[x])<<'\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...