Submission #1302422

#TimeUsernameProblemLanguageResultExecution timeMemory
1302422ArtTowers (NOI22_towers)C++20
100 / 100
562 ms192328 KiB
///     - Art -
#include <bits/stdc++.h>

#define el              cout << '\n'

#define MASK(x)         (1 << (x))
#define BIT(i, x)       ((x) >> (i) & 1)

#define corved(x)       ((BIT(0, x) && BIT(1, x)) || (BIT(2, x) && BIT(3, x)))

#define FOR(i, a, b)    for (int i = (a), _b = (b); i <= _b; ++i)
#define REV(i, b, a)    for (int i = (b), _a = (a); i >= _a; --i)
#define REP(i, c)       for (int i = 0, _c = (c); i < _c; ++i)

const int N = 1e6 + 7;

using namespace std;

int n;
pair<int, int> p[N];
set<pair<int, int>> row[N], col[N];
bool ans[N];
int pos[N];

void dfs(int idx, int val) {
    auto [x, y] = p[idx];
    if (pos[idx] == 0) {
        col[y].emplace(x, idx);
    }
    ans[idx] = 1;
    pos[idx] |= val;
    if ((int)col[y].size() < 3) {
        return;
    }

    int ridx = next(col[y].begin())->second;
    auto [rx, ry] = p[ridx];
    col[ry].erase({rx, ridx});

    if (pos[ridx] == 1) {
        auto it = row[rx].lower_bound({ry, ridx});
        it = row[rx].erase(it);
        dfs(it->second, 1);
    }
    else if (pos[ridx] == 2) {
        auto it = row[rx].lower_bound({ry, ridx});
        it = prev(row[rx].erase(it));
        dfs(it->second, 2);
    }
    else {
        row[rx].erase({ry, ridx});
    }
    ans[ridx] = pos[ridx] = 0;
}

int main() {

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

    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n;
    FOR (i, 1, n) {
        int x, y;
        cin >> x >> y;
        p[i] = make_pair(x, y);
        row[x].emplace(y, i);
    }

    FOR (i, 1, 1e6) if (!row[i].empty()) {
        dfs(row[i].begin()->second, 1);
        dfs(prev(row[i].end())->second, 2);
    }

    FOR (i, 1, n) {
        cout << ans[i];
    } el;

    return 0;
}
/*
9
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
*/
/*
8
1 5
3 5
6 7
6 5
6 1
3 7
6 3
5 5
*/

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen(name".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...