제출 #1222894

#제출 시각아이디문제언어결과실행 시간메모리
1222894ByeWorldPassport (JOI23_passport)C++20
48 / 100
1105 ms1114112 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") #define int long long #define ll long long #define se second #define fi first #define pb push_back #define lf (id<<1) #define rg ((id<<1)|1) #define md ((l+r)>>1) using namespace std; typedef pair<int,int> pii; typedef pair<int,pii> ipii; const int MAXN = 2e5+10; const int SQRT = 450; const int INF = 2e9; const int MOD = 998244353; const int LOG = 20; int sum(int a, int b){ a%=MOD; b%=MOD; return (a+MOD+b)%MOD; } void chsum(int &a, int b){ a%=MOD; b%=MOD; a = (a+MOD+b)%MOD; } int mul(int a, int b){ return (a*b)%MOD; } int expo(int a, int b){ if(b==0) return 1; int te = expo(a, b/2); te = mul(te,te); return (b%2 ? mul(te,a) : te); } void chmul(int &a, int b){ a = (a*b)%MOD; } void chmn(auto &a, auto b){ a = min(a, b); } void chmx(auto &a, auto b){ a = max(a, b); } int n, l[MAXN], r[MAXN]; vector<pii> adj[MAXN]; int dis[MAXN], ans[MAXN]; int q[2*MAXN], le=MAXN, ri=MAXN-1; int cnt; void bfs(int sta){ le = MAXN; ri = MAXN-1; for(int i=1; i<=cnt; i++) dis[i] = INF; dis[sta] = 0; q[++ri] = sta; while(le <= ri){ auto nw = q[le]; le++; for(auto [nx, ty] : adj[nw]){ if(ty){ if(dis[nx] > dis[nw]+1){ dis[nx] = dis[nw]+1; q[++ri] = nx; } } else { if(dis[nx] > dis[nw]){ dis[nx] = dis[nw]; q[--le] = nx; } } } } } void solve(){ le = MAXN; ri = MAXN-1; for(int i=1; i<=cnt; i++){ dis[i] = ans[i]; q[++ri] = i; } while(le <= ri){ auto nw = q[le]; le++; for(auto [nx, ty] : adj[nw]){ if(ty){ if(dis[nx] > dis[nw]+1){ dis[nx] = dis[nw]+1; q[++ri] = nx; } } else { if(dis[nx] > dis[nw]){ dis[nx] = dis[nw]; q[--le] = nx; } } } } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; cnt = n; for(int i=1; i<=n; i++){ cin>>l[i]>>r[i]; adj[++cnt].pb({i, 1}); for(int j=l[i]; j<=r[i]; j++){ adj[j].pb({cnt, 0}); } } bfs(1); for(int i=1; i<=cnt; i++) ans[i] = dis[i]; bfs(n); for(int i=1; i<=cnt; i++) ans[i] += dis[i]; // for(int i=1; i<=cnt; i++) cout << i << ' ' << ans[i] << " ans\n"; // for(int i=1; i<=cnt; i++) adj[i].clear(); // cnt = n; // for(int i=1; i<=n; i++){ // adj[i].pb({++cnt, 1}); // for(int j=l[i]; j<=r[i]; j++) // adj[cnt].pb({j, 0}); // } solve(); int Q;cin>>Q; while(Q--){ int x; cin>>x; cout << (dis[x] >= INF ? -1 : dis[x]) << '\n'; } }
#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...