Submission #784647

#TimeUsernameProblemLanguageResultExecution timeMemory
784647MohamedAliSaidanePassport (JOI23_passport)C++14
22 / 100
91 ms74188 KiB
#include <bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef long long ll; typedef pair<ll,ll> pll; typedef pair<int,int> pii; #define ff first #define ss second #define pb push_back #define all(x) (x).begin(),(x).end() const int nax = 2e5 + 4; int n, q; vi L, R, X; int LG[nax]; int sp[nax][20], ps[nax][20]; int comp1(int i, int j) { if(R[i] == R[j]) { if(L[i] < L[j]) return i; else return j; } else if(R[i] > R[j]) return i; else return j; } int comp2(int i, int j) { if(L[i] == L[j]) { if(R[i] > R[j]) return i; else return j; } else if(L[i] < L[j]) return i; else return j; } void build() { for(int i =0 ; i < n;i++) sp[i][0] = i; for(int i = 0; i < n; i++) ps[i][0] = i; //cout << "here" << endl; for(int j = 1; j < 20; j++) { //cout << j << endl; for(int i = 0; i + (1 << (j - 1)) < n;i ++) { sp[i][j] = comp1(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]); ps[i][j] = comp2(ps[i][j - 1], ps[i + (1 << (j - 1))][j - 1]); } } } int RMQ(int l, int r) { int j = LG[r - l + 1]; return comp1(sp[l][j], sp[r- (1 << j) + 1][j]); } int rmq(int l, int r) { int j = LG[r - l + 1]; return comp2(ps[l][j], ps[r - (1 << j) + 1][j]); } int dp[2505][2505]; int f(int l, int r) { if(dp[l][r] != -1) return dp[l][r]; if(l == 0 && r == n - 1) return dp[l][r] = 0; int ans = n + 2; int a = RMQ(l, r); int b = rmq(l, r); int la = min(l, L[a]), ra = max(r, R[a]); int lb = min(l, L[b]), rb = max(r, R[b]); if(la < l || ra > r) ans = min(ans, f(la, ra) + 1); if(lb < l || rb > r) ans = min(ans, f(lb, rb) + 1); return dp[l][r] = ans; } void solve() { cin >> n; memset(dp, -1, sizeof(dp)); L.resize(n); R.resize(n); for(int i =0; i < n; i++) { cin >> L[i] >> R[i]; L[i]--; R[i]--; } build(); //cout << "here" << endl; cin >> q; while(q--) { int X; cin >> X; X--; int l = L[X], r = R[X]; int ans = f(l, r) + 1; if(ans >= n + 1) cout << "-1\n"; else cout << ans << '\n'; } } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); LG[1] = 0; for(int i =2; i < nax; i++) LG[i] = LG[i/2] + 1; int tt = 1; while(tt--) solve(); }
#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...