Submission #1144070

#TimeUsernameProblemLanguageResultExecution timeMemory
1144070Mike_VuColors (RMI18_colors)C++17
38 / 100
167 ms27668 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double dou;
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
#define BITJ(x, j) (((x)>>(j))&1)
#define MASK(j) (1LL<<(j))
#define ALL(v) v.begin(), v.end()

template<typename T> bool maximize(T &x, const T &y) {
    if (x < y) {x = y; return 1;}
    return 0;
}
template<typename T> bool minimize(T &x, const T &y) {
    if (x > y) {x = y; return 1;}
    return 0;
}

struct DSU{
    int n;
    vector<int> dsu;
    vector<bool> val;
    void init(int _n) {
        n = _n;
        dsu.assign(n+1, -1);
        val.assign(n+1, 0);
    }
    int f(int u) {
        return dsu[u] < 0 ? u : dsu[u] = f(dsu[u]);
    }
    bool join(int u, int v) {
        u = f(u);
        v = f(v);
        if (u == v) return 0;
        if (dsu[u] > dsu[v]) swap(u, v);
        dsu[u] += dsu[v];
        dsu[v] = u;
        val[u] = val[u]|val[v];
        return 1;
    }
    void turn(int u, bool x) {
        val[f(u)] = x;
    }
    bool fval(int u) {
        return val[f(u)];
    }
};

const int maxn = 15e4+5;
int n, m, a[maxn], b[maxn];
vector<int> adj[maxn], posa[maxn], posb[maxn];
DSU dsu;
bool ans, act[maxn];

void addnode(int u) {
    act[u] = 1;
    for (int v : adj[u]) {
        if (act[v]) {
            dsu.join(u, v);
        }
    }
}

void solve() {
    //clear
    for (int i = 1; i <= n; i++) {
        adj[i].clear();
        posa[i].clear();
        posb[i].clear();
        act[i] = 0;
    }
    ans = 1;
    //input, getval
    for (int i= 1; i <= n; i++) {
        cin >> a[i];
        posa[a[i]].pb(i);
    }
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
        posb[b[i]].pb(i);
    }
    for (int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    //dsu 1
    dsu.init(n);
    for (int i = n; i; i--) {
        if (posa[i].empty() && !posb[i].empty()) {
            ans = 0;
            return;
        }
        for (int u : posa[i]) {
            addnode(u);
        }
        for (int u : posa[i]) {
            dsu.turn(u, 1);
        }
        for (int u : posb[i]) {
            if (!dsu.fval(u)) {
                ans = 0;
                return;
            }
        }
        for (int u : posa[i]) {
            dsu.turn(u, 0);
        }
    }
    //dsu 2
    dsu.init(n);
    for (int i= 1; i <= n; i++) {
        act[i] = 0;
    }
    for (int i = 1; i <= n; i++) {
        for (int u : posb[i]) {
            addnode(u);
        }
        for (int u : posa[i]) {
            dsu.turn(u, 1);
        }
        for (int u : posb[i]) {
            if (!dsu.fval(u)) {
                ans = 0;
                return;
            }
        }
        for (int u : posa[i]) {
            dsu.turn(u, 0);
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
//    #define name "task"
//    if (fopen(name".inp", "r")) {
//        freopen(name".inp", "r", stdin);
//        freopen(name".out", "w", stdout);
//    }
    int t;
    cin >> t;
//    while (cin >> n >> m) {
    while (t--) {
        cin >> n >> m;
        solve();
        cout << ans << "\n";
//        cout << endl;
    }
}
/*
1
4 4
3 3 2 1
1 2 2 1
1 2
2 3
3 4
4 2

2
4 4
3 3 2 1
2 1 2 1
1 2
2 3
3 4
4 2
4 4
3 3 2 1
1 2 2 1
1 2
2 3
3 4
4 2
*/
#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...