Submission #1320680

#TimeUsernameProblemLanguageResultExecution timeMemory
1320680BolatuluGift Exchange (JOI24_ho_t4)C++20
10 / 100
169 ms12612 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double db; #define int ll #define all(x) (x).begin(), (x).end() #define md ((tl + tr) >> 1) #define TL v + v, tl, md #define TR v + v + 1, md + 1, tr constexpr int maxn = 1'000'007; constexpr ll inf = 1e18 + 7; constexpr ll M = 1e9 + 7; int binpow(int a, int n) { if (n == 0) return 1; if (n & 1) return a * binpow(a, n - 1) % M; int x = binpow(a, n >> 1); return x * x % M; } const int dx[4] = {-1, 0, 1, 0}; const int dy[4] = {0, 1, 0, -1}; const db eps = 0.00000000001; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int random(int l, int r) { return uniform_int_distribution<int>(l, r)(rng); } int n, a[maxn], b[maxn], q, t1[4 * maxn], t2[4 * maxn], L[maxn], R[maxn], suf[maxn]; void upd1(int l, int r, int x, int v = 1, int tl = 1, int tr = 2 * n) { if (tl >= l && tr <= r) { t1[v] = max(t1[v], x); return; } if (tl > r || l > tr) return; upd1(l, r, x, TL), upd1(l, r, x, TR); } int get1(int p, int v = 1, int tl = 1, int tr = 2 * n) { if (tl == tr) { return t1[v]; } if (p <= md) return max(t1[v], get1(p, TL)); return max(t1[v], get1(p, TR)); } void upd2(int p, int x, int v = 1, int tl = 1, int tr = 2 * n) { if (tl == tr) { t2[v] = max(t2[v], x); return; } if (p <= md) upd2(p, x, TL); else upd2(p, x, TR); t2[v] = max(t2[v + v], t2[v + v + 1]); } int get2(int l, int r, int v = 1, int tl = 1, int tr = 2 * n) { if (tl >= l && tr <= r) return t2[v]; if (tl > r || l > tr) return 0; return max(get2(l, r, TL), get2(l, r, TR)); } void solve() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; memset(t1, 0, 4 * maxn); memset(t2, 0, 4 * maxn); for (int i = 1; i <= n; i++) { L[i] = max(get1(b[i]), get2(b[i] + 1, a[i] - 1)); upd1(b[i] + 1, a[i] - 1, i), upd2(b[i], i); } memset(t1, 0, 4 * maxn); memset(t2, 0, 4 * maxn); for (int i = n; i >= 1; i--) { R[i] = n + 1 - max(get1(b[i]), get2(b[i] + 1, a[i] - 1)); upd1(b[i] + 1, a[i] - 1, n - i + 1), upd2(b[i], n - i + 1); } for (int i = 0; i <= n + 1; i++) suf[i] = n + 1; for (int i = 1; i <= n; i++) { suf[R[i]] = min(suf[R[i]], L[i]); } for (int i = n; i >= 1; i--) { suf[i] = min(suf[i + 1], suf[i]); } cin >> q; for (int i = 1; i <= q; i++) { int l, r; cin >> l >> r; if (suf[r + 1] < l) cout << "No\n"; else cout << "Yes\n"; } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int test = 1; // cin >> test; while (test--) { solve(); // cout << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...