Submission #1135710

#TimeUsernameProblemLanguageResultExecution timeMemory
1135710mychecksedadPassport (JOI23_passport)C++17
100 / 100
344 ms118592 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 2e5+100, M = 1e5+10, K = 22, MX = 30; int n, L[N], R[N], q, rmq[N][K][2], up[N][K][2]; vector<int> S[N*4]; vi dist(N, MOD); void add(int l, int r, int ql, int qr, int k, int idx){ if(ql > r || l > qr) return; if(ql <= l && r <= qr){ S[k].pb(idx); return; } int m = l+r>>1; add(l, m, ql, qr, k<<1, idx); add(m+1, r, ql, qr, k<<1|1, idx); } vi TO; void rem(int l, int r, int p, int k){ for(auto c: S[k]){ if(dist[c] > dist[p] + 1){ dist[c] = dist[p] + 1; TO.pb(c); } } S[k].clear(); if(l == r){ return; } int m = l + r >> 1; if(p <= m){ rem(l, m, p, k<<1); }else{ rem(m+1, r, p, k<<1|1); } } int get(int l, int r){ int k = int(log2(r-l+1)); return R[rmq[l][k][0]] > R[rmq[r-(1<<k)+1][k][0]] ? rmq[l][k][0] : rmq[r-(1<<k)+1][k][0]; } int get2(int l, int r){ int k = int(log2(r-l+1)); return L[rmq[l][k][1]] < L[rmq[r-(1<<k)+1][k][1]] ? rmq[l][k][1] : rmq[r-(1<<k)+1][k][1]; } void solve(){ cin >> n; vector<pii> v; for(int i = 1; i <= n; ++i){ cin >> L[i] >> R[i]; rmq[i][0][0] = i; rmq[i][0][1] = i; } for(int j = 1; j < K; ++j){ for(int i = 1; i + (1<<j) <= n+1; ++i){ rmq[i][j][0] = R[rmq[i][j-1][0]] > R[rmq[i+(1<<(j-1))][j-1][0]] ? rmq[i][j-1][0] : rmq[i+(1<<(j-1))][j-1][0]; rmq[i][j][1] = L[rmq[i][j-1][1]] < L[rmq[i+(1<<(j-1))][j-1][1]] ? rmq[i][j-1][1] : rmq[i+(1<<(j-1))][j-1][1]; } } for(int i = 1; i <= n; ++i){ up[i][0][0] = get(L[i], R[i]); up[i][0][1] = get2(L[i], R[i]); } for(int j = 1; j < K; ++j){ for(int i = 1; i <= n; ++i){ up[i][j][0] = up[up[i][j - 1][0]][j - 1][0]; up[i][j][1] = up[up[i][j - 1][1]][j - 1][1]; } } vi go(n + 1); for(int i = 1; i <= n; ++i){ go[i] = 1; bool bad = 0; int v = i; for(int j = K-1; j >= 0; --j){ if(R[up[v][j][0]] < n){ v = up[v][j][0]; go[i] += (1<<j); } } if(R[v] == n) go[i] += 0; else go[i]++; if(R[up[v][0][0]] < n) bad = 1; v = i; for(int j = K-1; j >= 0; --j){ if(L[up[v][j][1]] > 1){ v = up[v][j][1]; go[i] += (1<<j); } } if(L[v] == 1) go[i] += 0; else go[i]++; if(L[up[v][0][1]] > 1) bad = 1; if(bad) go[i] = MOD; } priority_queue<pair<ll, int>> Q; vector<bool> vis(n + 1); for(int i = 1; i <= n; ++i){ add(1, n, L[i], R[i], 1, i); dist[i] = go[i]; Q.push({-dist[i], i}); } while(!Q.empty()){ int v = Q.top().ss; Q.pop(); if(vis[v]) continue; vis[v] = 1; rem(1, n, v, 1); for(int x: TO){ Q.push({-dist[x], x}); } TO.clear(); } // en; cin >> q; for(int i = 1; i <= q; ++i){ int v; cin >> v; cout << (dist[v] > n ? -1 : dist[v]) << '\n'; } } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); en; } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\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...