제출 #1222909

#제출 시각아이디문제언어결과실행 시간메모리
1222909ByeWorldPassport (JOI23_passport)C++20
54 / 100
1040 ms144820 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 = 2e6+10; const int SQRT = 450; const int INF = 1e9; 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[4*MAXN], le=2*MAXN, ri=2*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; } } } } } void bd(int id, int l, int r){ chmx(cnt, 2*n + id); if(id != 1) adj[2*n + id].pb({2*n + (id>>1), 0}); if(l==r){ adj[l].pb({2*n + id, 0}); return; } bd(lf,l,md); bd(rg,md+1,r); } void upd(int id, int l, int r, int x, int y, int des){ if(x<=l && r<=y){ adj[2*n + id].pb({des, 0}); return; } if(r<x || y<l) return; upd(lf,l,md,x,y,des); upd(rg,md+1,r,x,y,des); } 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}); upd(1, 1, n, l[i], r[i], cnt); // for(int j=l[i]; j<=r[i]; j++){ // adj[j].pb({cnt, 0}); // } } bd(1,1,n); cnt = MAXN-10; assert(cnt <= MAXN-10); // cout << cnt << " cnt\n"; bfs(1); for(int i=1; i<=cnt; i++) ans[i] = dis[i]; // for(int i=1; i<=cnt; i++) cout << i << ' ' << ans[i] << " ans\n"; bfs(n); for(int i=1; i<=cnt; i++) ans[i] += dis[i]; 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...