제출 #1041140

#제출 시각아이디문제언어결과실행 시간메모리
1041140victor_gaoGift Exchange (JOI24_ho_t4)C++17
100 / 100
1717 ms140192 KiB
//#pragma GCC optimize("Ofast,unroll-loops,O3")
//#pragma GCC target("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma,tune=native")
#include <bits/stdc++.h>
#define pii pair<int, int>
#define x first
#define y second
#define N 500015
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n, q, L1[N], R1[N], L2[N], R2[N], L[N], R[N], ord[2 * N], ans[N];
pii arr[N];
vector<int> qry[2 * N], rem[N];
vector<pii> query[N];

void solve(int l, int r){
    int mid = (l + r) >> 1;
    set<int> A;
    for (int i = l; i <= mid; i++)
        if (ord[i] > n && arr[ord[i] - n].x - 1 > mid)
            qry[min(r, arr[ord[i] - n].x - 1)].emplace_back(ord[i] - n);
    for (int i = mid + 1; i <= r; i++){ // B match A
        if (ord[i] <= n)
            A.insert(ord[i]);
        for (auto j : qry[i]){
            if (A.empty())
                continue;
            auto it = A.upper_bound(j);
            if (it != A.end())
                R1[j] = min(R1[j], *it);
            if (it != A.begin())
                L1[j] = max(L1[j], *prev(it));
        }
        qry[i].clear();
    }
}

void merge(int l, int r){
    if (l == r)
        return;
    int mid = (l + r) >> 1;
    merge(l, mid), merge(mid + 1, r);
    solve(l, r);
}

struct segtree{
    int seg[4 * N];
    void modify(int l, int r, int i, int p, int c){
        if (l == r){
            seg[i] = c;
            return;
        }
        int mid = (l + r) >> 1;
        if (p <= mid) modify(l, mid, i << 1, p, c);
        else modify(mid + 1, r, i << 1 | 1, p, c);
        seg[i] = min(seg[i << 1], seg[i << 1 | 1]);
    }
    int query(int l, int r, int i, int ll, int rr){
        if (ll <= l && rr >= r)
            return seg[i];
        int mid = (l + r) >> 1;
        if (rr <= mid) return query(l, mid, i << 1, ll, rr);
        else if (ll > mid) return query(mid + 1, r, i << 1 | 1, ll, rr);
        else return min(query(l, mid, i << 1, ll, rr), query(mid + 1, r, i << 1 | 1, ll, rr));
    }
}seg;


signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i].x, ord[arr[i].x] = i;
    for (int i = 1; i <= n; i++)
        cin >> arr[i].y, ord[arr[i].y] = i + n;
    fill(R1, R1 + N, n + 1);
    fill(R2, R2 + N, n + 1);
    merge(1, 2 * n);
    set<int> B;
    for (int i = 1; i <= 2 * n; i++){
        if (ord[i] <= n){
            B.erase(ord[i]);
            if (B.empty())
                continue;
            auto it = B.upper_bound(ord[i]);
            if (it != B.end())
                R2[ord[i]] = min(R2[ord[i]], *it);
            if (it != B.begin())
                L2[ord[i]] = max(L2[ord[i]], *prev(it));
        }
        else B.insert(ord[i] - n);
    }

    cin >> q;
    for (int i = 1; i <= q; i++){
        int l, r; cin >> l >> r;
        query[r].emplace_back(l, i);
    }
    
    for (int i = 1; i <= n; i++){
        L[i] = max(L1[i], L2[i]);
        R[i] = min(R1[i], R2[i]);
        rem[R[i]].emplace_back(i);
    }

    for (int i = 1; i <= n; i++){
        seg.modify(1, n, 1, i, L[i]);
        for (auto id : rem[i])
            seg.modify(1, n, 1, id, n + 1);
        for (auto [l, id] : query[i])
            ans[id] = (seg.query(1, n, 1, l, i) >= l) ? 1 : 0;
    }
    for (int i = 1; i <= q; i++)
        cout << ((ans[i] == 1) ? "Yes\n" : "No\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...