제출 #1350945

#제출 시각아이디문제언어결과실행 시간메모리
1350945msab3fColors (RMI18_colors)C++20
100 / 100
644 ms63132 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 150'000 + 10;

int n, m, a[MAX_N], b[MAX_N], sz[MAX_N], par[MAX_N], mark[MAX_N], wh[MAX_N];
vector<int> adj[MAX_N], a_t[MAX_N], b_t[MAX_N];
bool can;

void get(int x) {
    if (par[x] == x) {
        wh[x] = x;
    } else {
        get(par[x]);
        wh[x] = wh[par[x]];
    }
}

namespace DC {
    vector<int> seg[4 * MAX_N];
    bool on[MAX_N];

    void add(int u, int id = 1, int l = 1, int r = n + 1) {
        if (b[u] <= l && r <= a[u] + 1) {
            seg[id].push_back(u);
        } else {
            int mid = (l + r) >> 1;
            if (b[u] < mid) {
                add(u, id << 1, l, mid);
            }
            if (mid <= a[u]) {
                add(u, id << 1 | 1, mid, r);
            }
        }
    }

    void dfs(int id = 1, int l = 1, int r = n + 1) {
        vector<vector<int>> compss;
        static int last = 0;
        for (int u : seg[id]) {
            on[u] = true;
            get(u);
            compss.push_back({});
            ++last;
            auto& comps = compss.back();
            if (mark[wh[u]] != last) {
                mark[wh[u]] = last;
                comps.push_back(wh[u]);
            }
            for (int v : adj[u]) {
                if (!on[v]) continue;
                get(v);
                if (mark[wh[v]] != last) {
                    mark[wh[v]] = last;
                    comps.push_back(wh[v]);
                }
            }
            if (comps.size() > 1) {
                for (int i = 1; i < comps.size(); ++i) {
                    if (sz[comps[i]] > sz[comps[0]]) {
                        swap(comps[i], comps[0]);
                    }
                }
                for (int i = 1; i < comps.size(); ++i) {
                    par[comps[i]] = comps[0];
                    sz[comps[0]] += sz[comps[i]];
                }
            }
        }
        if (r - l == 1) {
            ++last;
            for (int u : a_t[l]) {
                get(u);
                mark[wh[u]] = last;
            }
            for (int u : b_t[l]) {
                get(u);
                can &= mark[wh[u]] == last;
            }
        } else {
            int mid = (l + r) >> 1;
            dfs(id << 1, l, mid);
            dfs(id << 1 | 1, mid, r);
        }
        for (int u : seg[id]) {
            on[u] = false;
        }
        for (auto& comps : compss) {
            if (comps.size() > 1) {
                for (int i = 1; i < comps.size(); ++i) {
                    par[comps[i]] = comps[i];
                    sz[comps[0]] -= sz[comps[i]];
                }
            }
        }
    }

    void reset(int id = 1, int l = 1, int r = n + 1) {
        seg[id].clear();
        if (r - l > 1) {
            int mid = (l + r) >> 1;
            reset(id << 1, l, mid);
            reset(id << 1 | 1, mid, r);
        }
    }
}

void solve() {
    cin >> n >> m;

    for (int u = 1; u <= n; ++u) {
        cin >> a[u];
        a_t[a[u]].push_back(u);
    }

    for (int u = 1; u <= n; ++u) {
        cin >> b[u];
        b_t[b[u]].push_back(u);
    }

    for (int e = 1; e <= m; ++e) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    for (int u = 1; u <= n; ++u) {
        if (b[u] > a[u]) {
            cout << "0\n";
            return;
        }
        sz[u] = 1;
        par[u] = u;
        DC::add(u);
    }

    can = true;

    DC::dfs();

    if (can) {
        cout << "1\n";
    } else {
        cout << "0\n";
    }
}

void clear_data() {
    DC::reset();
    for (int i = 1; i <= n; ++i) {
        a[i] = b[i] = sz[i] = par[i] = wh[i] = 0;
        adj[i].clear();
        a_t[i].clear();
        b_t[i].clear();
    }
    n = m = 0;
    can = false;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        solve();
        clear_data();
    }
}
#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...