Submission #948123

# Submission time Handle Problem Language Result Execution time Memory
948123 2024-03-17T15:41:10 Z Blagoj Colors (RMI18_colors) C++17
32 / 100
121 ms 51036 KB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'
#define ll long long
#define all(x) (x).begin(), (x).end()

const int mxn = 2e5;

vector<int> a(mxn), b(mxn), cntA[mxn], cntB[mxn], ldr(mxn), rnk(mxn);
vector<pair<int, int>> edges, sgt[8 * mxn + 1];

struct State {
    int x, y, xSize, ySize;
};

stack<State> s;

void clear(int n) {
    edges.clear();
    while (s.size()) s.pop();
    for (int i = 1; i <= n; i++) {
        ldr[i] = i;
        rnk[i] = 1;
        cntA[i].clear();
        cntB[i].clear();
    }
    for (int i = 1; i <= 8 * n; i++) sgt[i].clear();        
}

void update(int k, int l, int r, int i, int j, pair<int, int> x) {
    if (l > j || r < i) return;
    if (i <= l && r <= j) {
        sgt[k].push_back(x);
        return;
    }
    int mid = (l + r) / 2;
    update(k * 2, l, mid, i, j, x);
    update(k * 2 + 1, mid + 1, r, i, j, x);
}

bool flag;

int Find(int x) {
    if (x != ldr[x]) return ldr[x] = Find(ldr[x]);
    return ldr[x];
}

void Union(int x, int y) {
    x = Find(x), y = Find(y);
    if (x == y) return;
    if (rnk[x] < rnk[y]) swap(x, y);
    s.push({x, y, rnk[x], rnk[y]});
    ldr[y] = x;
    rnk[x] += rnk[y];
}

void rollback(int sz) {
    while (s.size() > sz) {
        State top = s.top();
        s.pop();
        ldr[top.x] = top.x;
        ldr[top.y] = top.y;
        rnk[top.x] = top.xSize;
        rnk[top.y] = top.ySize;
    }
}

void solve(int k, int l, int r) {
    int sz = s.size();
    for (auto [f, t] : sgt[k]) Union(f, t);
    if (l == r) {
        unordered_set<int> cnt;
        for (auto x : cntA[l]) cnt.insert(Find(x));
        for (auto x : cntB[l]) {
            if (!cnt.count(Find(x))) flag = 0;
        }
    }
    else {
        int mid = (l + r) / 2;
        solve(k * 2, l, mid);
        solve(k * 2 + 1, mid + 1, r);
    }
    rollback(sz);
}

void testCase() {
    int n, m;
    cin >> n >> m;
    clear(n);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cntA[a[i]].push_back(i);
    }
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
        cntB[b[i]].push_back(i);
    }
    for (int i = 0; i < m; i++) {
        int f, t;
        cin >> f >> t;
        edges.push_back({f, t});
    }
    for (int i = 1; i <= n; i++) {
        if (a[i] < b[i]) {
            cout << 0 << endl;
            return;
        }
    }
    for (auto [f, t] : edges) {
        int mn = max(b[f], b[t]);
        int mx = min(a[f], a[t]);
        if (mn <= mx) update(1, 1, n, mn, mx, {f, t});
    }
    flag = 1;
    solve(1, 1, n);
    cout << flag << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
        testCase();
    }
}

Compilation message

colors.cpp: In function 'void rollback(int)':
colors.cpp:60:21: warning: comparison of integer expressions of different signedness: 'std::stack<State>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   60 |     while (s.size() > sz) {
      |            ~~~~~~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 66 ms 50600 KB Output is correct
2 Correct 30 ms 50524 KB Output is correct
3 Correct 14 ms 50780 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 54 ms 50708 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 67 ms 50524 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 67 ms 50524 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 66 ms 50600 KB Output is correct
2 Correct 30 ms 50524 KB Output is correct
3 Correct 14 ms 50780 KB Output is correct
4 Incorrect 67 ms 50524 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 121 ms 50628 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 39 ms 50816 KB Output is correct
2 Correct 21 ms 51036 KB Output is correct
3 Correct 16 ms 50712 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 66 ms 50600 KB Output is correct
2 Correct 30 ms 50524 KB Output is correct
3 Correct 14 ms 50780 KB Output is correct
4 Correct 54 ms 50708 KB Output is correct
5 Incorrect 67 ms 50524 KB Output isn't correct
6 Halted 0 ms 0 KB -