Submission #1146317

#TimeUsernameProblemLanguageResultExecution timeMemory
1146317Zero_OPColors (RMI18_colors)C++20
22 / 100
41 ms5188 KiB
#include <bits/stdc++.h>

using namespace std;

#define rep(i, l, r) for(int i = (l); i < (r); ++i)
#define all(v) begin(v), end(v)
#define compact(v) v.erase(unique(all(v)), end(v))
#define sz(v) (int)v.size()
#define dbg(x) "[" #x " = " << (x) << "]"
#define file(task) if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); }

template<typename T>
bool minimize(T& a, const T& b){
    if(a > b) return a = b, true;
    return false;
}

template<typename T>
bool maximize(T& a, const T& b){
    if(a < b) return a = b, true;
    return false;
}

using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vl = vector<ll>;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MAX = 2e5 + 5;

int N, M, a[MAX], b[MAX];
vi adj[MAX];

namespace subtask1{ //star graph
    bool check(){
        int a = 0, b = 0;
        rep(i, 0, N){
            if(sz(adj[i]) == 1) ++a;
            else if(sz(adj[i]) == N - 1) ++b;
            else return false;
        }
        return a == N - 1 && b == 1;
    }

    void solve(){
        vi idx(N);
        iota(all(idx), 0);
        sort(all(idx), [&](int i, int j){
            return b[i] > b[j];
        });


        int mid = -1;
        rep(i, 0, N) if(sz(adj[i]) == N - 1) mid = i;

        for(auto u : idx){
            if(a[u] < b[u]){
                cout << 0 << '\n';
                return;
            }

            if(a[u] == b[u]) continue;

            rep(i, 0, N){
                if(a[i] == b[u]){
                    minimize(a[mid], a[i]);
                    minimize(a[u], a[mid]);
                    break;
                }
            }

            if(a[u] != b[u]){
                cout << 0 << '\n';
                return;
            }
        }

        rep(i, 0, N) {
            if(a[i] != b[i]){
                cout << 0 << '\n';
                return;
            }
        }

        cout << 1 << '\n';
    }
}

namespace subtask2{
    bool check(){
        rep(i, 0, N){
            if(sz(adj[i]) != N - 1) return false;
        }
        return true;
    }

    void solve(){
        vi idx(N);
        iota(all(idx), 0);
        sort(all(idx), [&](int i, int j){ return b[i] > b[j]; });
        for(auto u : idx){
            if(a[u] < b[u]){
                cout << 0 << '\n';
                return;
            }

            bool found = false;
            rep(i, 0, N){
                if(a[i] == b[u]){
                    a[u] = b[u];
                    found = true;
                }
            }

            if(!found){
                cout << 0 << '\n';
                return;
            }
        }

        rep(i, 0, N){
            if(a[i] != b[i]){
                cout << 0 << '\n';
                return;
            }
        }

        cout << 1 << '\n';
    }
}

namespace subtask3{
    bool check(){
        return true;
    }

    void solve(){
        cout << 0 << '\n';
    }
}

void testcase(){
    cin >> N >> M;
    rep(i, 0, N) cin >> a[i];
    rep(i, 0, N) cin >> b[i];

    rep(i, 0, M){
        int u, v;
        cin >> u >> v;
        --u, --v;
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }

    rep(i, 0, N){
        if(a[i] < b[i]){
            cout << 0 << '\n';
            return;
        }
    }

    if(subtask1::check()) return subtask1::solve(), void();
    if(subtask2::check()) return subtask2::solve(), void();
    if(subtask3::check()) return subtask3::solve(), void();
}

void reset_data(){
    rep(i, 0, N) adj[i].clear();
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef LOCAL
    freopen("task.inp", "r", stdin);
    freopen("task.out", "w", stdout);
#endif // LOCAL

    int t;
    cin >> t;
    while(t--) testcase(), reset_data();

    return 0;
}

/*

Subtask 1 :

4 3
1 2 3 4
1 1 2 3
1 2
1 3
4 1

3 3
1 2 3
1 1 2
1 2
2 3
3 1

*/
#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...