Submission #1316100

#TimeUsernameProblemLanguageResultExecution timeMemory
1316100panhcutizzColors (RMI18_colors)C++17
0 / 100
112 ms21684 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

#define ll long long
#define vi vector <int>
#define pi pair<int , int>
#define FOR(i , l , r) for(int i = l; i <= r; ++ i)
#define FORD(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)) , v.end())
#define pb push_back
#define eb emplace_back
#define fi first
#define se second

#define anhHieuchimbe signed main

template <class T> bool maximize(T &a , T b){return (a < b) ? a = b , true : false;}
template <class T> bool minimize(T &a , T b){return (a > b) ? a = b , true : false;}

const int nd = 1e5 + 5;

int A[nd] , B[nd];
bool valid[nd];
vi adj[nd];

namespace dsu{
    int par[nd] , sz[nd] , used[nd];
    int totalUp;
    vector <pi> upPar , upSz , upVal;

    void init(int n){   
        FOR(i , 1 , n) par[i] = i , sz[i] = 1 , used[i] = valid[i];
        totalUp = 0;
    }

    int get(int u){return u == par[u] ? u : get(par[u]);}

    void unite(int u , int v){
        u = get(u) , v = get(v);
        if(u == v) return;

        if(sz[u] > sz[v]) swap(u , v);
        upPar.eb(u , par[u]);
        par[u] = v;
        upSz.eb(v , sz[v]);
        sz[v] += sz[u];
        upVal.eb(v , used[v]);
        used[v] |= used[u];
        ++ totalUp;
    }

    void roll_back(int snapShot){
        while(totalUp > snapShot){
            par[upPar.back().fi] = upPar.back().se;
            sz[upSz.back().fi] = upSz.back().se;
            used[upVal.back().fi] = upVal.back().se;

            upPar.pop_back();
            upSz.pop_back();
            upVal.pop_back();
            -- totalUp;
        }
    }
}

namespace ST{
    vector <pi> st[4 * nd];
    vi query[4 * nd];
    bool vis[nd];

    void init(int n){
        ++ n;
        FOR(i , 0 , 4 * n) st[i].clear() , query[i].clear();
        FOR(i , 1 , n) vis[i] = false;
    }

    void up(int id , int l , int r , int a , int b , int u , int f){
        if(l > b || r < a) return;
        if(a <= l && r <= b){
            st[id].eb(f , u);
            return;
        }
        int mid = (r + l) >> 1;
        up(id * 2 , l , mid , a , b , u , f);
        up(id * 2 + 1 , mid + 1 , r , a , b , u , f);
    }

    void queryUp(int id , int l , int r , int x , int u){
        if(l > x || r < x) return;
        if(l == r){
            query[id].eb(u);
            return;
        }
        int mid = (r + l) >> 1;
        queryUp(id * 2 , l , mid , x , u);
        queryUp(id * 2 + 1 , mid + 1 , r , x , u);
    }

    bool build(int id , int l , int r){
        int snapShot = dsu::totalUp;
        sort(all(st[id]));

        for(auto [f , u] : st[id]){
            vis[u] = true;
            for(int v : adj[u]) if(vis[v]){
                dsu::unite(u , v);
            }
        }

        if(l < r){
            int mid = (r + l) >> 1;
            bool res = build(id * 2 , l , mid) & build(id * 2 + 1 , mid + 1 , r);

            dsu::roll_back(snapShot);
            for(auto [f , u] : st[id]) vis[u] = false;   
            return res;
        }
        else{
            bool res = true;
            for(int u : query[id]){
                res &= dsu::used[dsu::get(u)];
            }

            dsu::roll_back(snapShot);
            for(auto [u , f] : st[id]) vis[u] = false;   
            return res;
        }
    }
}

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

    ST::init(n);
    FOR(i , 1 , n) adj[i].clear();

    FOR(i , 1 , n) cin >> A[i];
    FOR(i , 1 , n){
        cin >> B[i];

        if(B[i] > A[i]){
            cout << 0;
            return;
        }

        valid[i] = (A[i] == B[i]);

        ST::up(1 , 1 , n , B[i] , A[i] , i , (A[i] != B[i]));
        ST::queryUp(1 , 1 , n , B[i] , i);
    }

    FOR(i , 1 , m){
        int u , v;
        cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }

    dsu::init(n);

    cout << ST::build(1 , 1 , n) << '\n';
}

anhHieuchimbe() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    #define task "task"
    if(fopen(task".inp" , "r")){
        freopen(task".inp" , "r" , stdin);
        freopen(task".out" , "w" , stdout);
    }

    int test_case = 0;
    cin >> test_case;
    while(test_case --) solve();
}

Compilation message (stderr)

colors.cpp: In function 'int main()':
colors.cpp:175:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  175 |         freopen(task".inp" , "r" , stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
colors.cpp:176:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |         freopen(task".out" , "w" , stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...