Submission #443275

#TimeUsernameProblemLanguageResultExecution timeMemory
443275valerikkColors (RMI18_colors)C++17
100 / 100
802 ms75876 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int N = 1.5e5 + 123;

int n, m;
int a[N], b[N];
vector<pair<int, int>> t[4 * N];
int p[N], sz[N], mn[N];
vector<pair<int*, int>> st;
vector<int> by_b[N];
int ans;

int get(int v) {
    while (v != p[v]) v = p[v];
    return v;
}

void merge(int v, int u) {
    v = get(v), u = get(u);
    if (v != u) {
        if (sz[v] > sz[u]) swap(v, u);
        st.push_back({&sz[u], sz[u]});
        st.push_back({&mn[u], mn[u]});
        st.push_back({&p[v], p[v]});
        sz[u] += sz[v];
        mn[u] = min(mn[u], mn[v]);
        p[v] = u;
    }
}

void backup(int x) {
    while (st.size() > x) {
        auto pp = st.back();
        *pp.first = pp.second;
        st.pop_back();
    }
}

void add(int v, int l, int r, int x, int y, pair<int, int> pp) {
    if (l >= y || r <= x) return;
    if (l >= x && r <= y) {
        t[v].push_back(pp);
        return;
    }
    int mid = (l + r) / 2;
    add(2 * v, l, mid, x, y, pp);
    add(2 * v + 1, mid, r, x, y, pp);
}

void dfs(int v, int l, int r) {
    int x = st.size();
    for (auto pp : t[v]) merge(pp.first, pp.second);
    if (r - l == 1) {
        for (int i : by_b[l]) {
            if (mn[get(i)] != l) ans = 0;
        }
    } else {
        int mid = (l + r) / 2;
        dfs(2 * v, l, mid);
        dfs(2 * v + 1, mid, r);
    }
    backup(x);
}

int solve() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        a[i]--;
    }
    for (int i = 0; i < n; i++) {
        cin >> b[i];
        b[i]--;
    }
    for (int i = 0; i < n; i++) by_b[i].clear();
    for (int i = 0; i < 4 * n; i++) t[i].clear();
    while (m--) {
        int v, u;
        cin >> v >> u;
        v--, u--;
        int l = max(b[v], b[u]), r = min(a[v], a[u]);
        if (l <= r) add(1, 0, n, l, r + 1, {v, u});
    }
    for (int i = 0; i < n; i++) {
        if (a[i] < b[i]) return 0;
    }
    for (int i = 0; i < n; i++) {
        p[i] = i;
        sz[i] = 1;
        mn[i] = a[i];
        by_b[b[i]].push_back(i);
    }
    ans = 1;
    dfs(1, 0, n);
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T--) {
        cout << solve() << "\n";
    }
    return 0;
}

Compilation message (stderr)

colors.cpp: In function 'void backup(int)':
colors.cpp:34:22: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int*, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   34 |     while (st.size() > x) {
      |            ~~~~~~~~~~^~~
#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...