Submission #1302361

#TimeUsernameProblemLanguageResultExecution timeMemory
1302361tuandqTowers (NOI22_towers)C++20
12 / 100
305 ms73044 KiB
#include <bits/stdc++.h>
using namespace std ;

typedef long long ll ;
typedef long double ld ;
typedef pair<int, int> pii ;
typedef pair<int, long long> pil ;
typedef pair<long long, int> pli ;
typedef pair<long long, long long> pll ;

#define bitc(n) (__builtin_popcountll(n))
#define clz(n) (__builtin_clzll(n))
#define ctz(n) (__builtin_ctzll(n))
#define lgi(n) (31 - __builtin_clz(n))
#define lgl(n) (63 - __builtin_clzll(n))
#define MASK(k) (1ll << (k))
#define getbit(n, k) ((n) >> (k) & 1)
#define flipbit(n, k) ((n) ^ (1ll << (k)))
#define ton(n, k) ((n) | (1ll << (k)))
#define toff(n, k) ((n) & ~(1ll << (k)))

#define fi first
#define se second
#define mp make_pair
#define eb emplace_back
#define lwb lower_bound
#define upb upper_bound
#define sz(x) (int)(x.size())
#define all(x) x.begin(),x.end()
#define taskname "slamp"

template<class X, class Y>
bool maximize(X &x, const Y &y) {
    if(x < y) {
        return x = y, true ;
    }
    return false ;
}

template<class X, class Y>
bool minimize(X &x, const Y &y) {
    if(x > y) {
        return x = y, true ;
    }
    return false ;
}

template<class X>
void removeDup(vector<X> &ve) {
    sort(ve.begin(), ve.end()) ;
    ve.resize(unique(ve.begin(), ve.end()) - ve.begin()) ;
}

const ll INF = 1e18 ;
const int inf = 1e9 ;
const int mod = 1e9 + 7 ;
const int N = 1e6 + 5, LG = 17 ;

/* Some Peach Tea Is Great ;-; */
/* Author : Tuandq */

int n ;
pii a[N] ;

namespace sub6 {
    vector<pii> row[N], col[N] ;
    
    int maskRow[N], maskCol[N], le, ri, up, dw ;
    bitset<N> mark ;
    
    void upset(const int &idx, int c, int r) {
        mark.set(idx) ; maskRow[a[idx].se] |= r ; maskCol[a[idx].fi] |= c ;
    }

    bool makeCol(int idx) {
        if(col[idx].empty() || maskCol[idx] == 3) return false ;

        vector<pii> &ve = col[idx] ;
        while(!ve.empty() && (ve.back().fi > up || maskRow[ve.back().fi] == 3)) maskRow[ve.back().fi] |= 2, ve.pop_back() ;

        reverse(all(ve)) ;
        while(!ve.empty() && (ve.back().fi < dw || maskRow[ve.back().fi] == 3)) maskRow[ve.back().fi] |= 1, ve.pop_back() ;

        reverse(all(ve)) ;

        return !ve.empty() ;
    }

    bool makeRow(int idx) {
        if(row[idx].empty() || maskRow[idx] == 3) return false ;

        vector<pii> &ve = row[idx] ;
        while(!ve.empty() && (ve.back().fi > ri || maskCol[ve.back().fi] == 3)) maskCol[ve.back().fi] |= 2, ve.pop_back() ;

        reverse(all(ve)) ;
        while(!ve.empty() && (ve.back().fi < le || maskCol[ve.back().fi] == 3)) maskCol[ve.back().fi] |= 1, ve.pop_back() ;

        reverse(all(ve)) ;

        return !ve.empty() ;
    }

    void solve() {
        for(int i = 1; i <= n; i ++) {
            col[a[i].fi].emplace_back(a[i].se, i) ;
            row[a[i].se].emplace_back(a[i].fi, i) ;
        }

        for(int i = 1; i < N; i ++) {
            sort(all(row[i])) ; sort(all(col[i])) ;
        }

        le = 1, ri = N - 1, up = N - 1, dw = 0 ;
        while(true) {
            while(le <= ri && !makeCol(le)) ++ le ;
            while(ri >= le && !makeCol(ri)) -- ri ;
            while(dw <= up && !makeRow(dw)) ++ dw ;
            while(up >= dw && !makeRow(up)) -- up ;

            if(le > ri || dw > up) break ;

            if(le == ri) {
                int p = 0, q = sz(col[le]) - 1 ;
                while(p <= q && col[le][p].fi < dw) ++ p ;
                while(q >= p && col[le][q].fi > up) -- q ;

                if(p <= q) {
                    if(p == q) upset(col[le][p].se, 3, 0) ;
                    else {
                        if(~maskCol[le] >> 0 & 1) upset(col[le][p].se, 1, 0) ;
                        if(~maskCol[le] >> 1 & 1) upset(col[le][q].se, 2, 0) ;
                    }
                }
                break ;
            }

            if(dw == up) {
                int p = 0, q = sz(row[up]) - 1 ;
                while(p <= q && row[up][p].fi < le) ++ p ;
                while(q >= p && row[up][q].fi > ri) -- q ;
                if(p <= q) {
                    if(p == q) upset(row[up][p].se, 0, 3) ;
                    else {
                        if(~maskRow[up] >> 0 & 1) upset(row[up][p].se, 0, 1) ;
                        if(~maskRow[up] >> 1 & 1) upset(row[up][q].se, 0, 2) ;
                    }
                }
                break ;
            }

            vector<pii> pot = {mp(le, 1), mp(ri, 2)} ;
            for(pii cur : pot) {
                int p = 0, q = sz(col[cur.fi]) - 1 ;
                while(p <= q && col[le][p].fi < dw) ++ p ;
                while(q >= p && col[le][q].fi > up) -- q ;
                if(p <= q) {
                    if(p == q) upset(col[cur.fi][p].se, 3, cur.se) ;
                    else {
                        if(~maskCol[cur.fi] >> 0 & 1) upset(col[cur.fi][p].se, 1, cur.se) ;
                        if(~maskCol[cur.fi] >> 1 & 1) upset(col[cur.fi][q].se, 2, cur.se) ;
                    }
                }
            }

            pot = {mp(dw, 1), mp(up, 2)} ;
            for(pii cur : pot) {
                int p = 0, q = sz(row[cur.fi]) - 1 ;
                while(p <= q && row[cur.fi][p].fi < le) ++ p ;
                while(q >= p && row[cur.fi][q].fi > ri) -- q ;
                if(p <= q) {
                    if(p == q) upset(row[cur.fi][p].se, cur.se, 3) ;
                    else {
                        if(~maskRow[cur.fi] >> 0 & 1) upset(row[cur.fi][p].se, cur.se, 1) ;
                        if(~maskRow[cur.fi] >> 1 & 1) upset(row[cur.fi][q].se, cur.se, 2) ;
                    }
                }
            }
        }

        for(int i = 1; i <= n; i ++) cout << mark[i] ;
    }
}

void kittncool() {
    cin >> n ;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i].fi >> a[i].se ;
    }

    return sub6::solve() ;
}

signed main() {
    ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0) ;
    if(fopen(taskname".inp", "r")) {
        freopen(taskname".inp", "r", stdin) ;
        freopen(taskname".out", "w", stdout) ;
    }

    int t = 1 ; //cin >> t ;
    while(t --) {
        kittncool() ;
    }
}

Compilation message (stderr)

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