Submission #1302385

#TimeUsernameProblemLanguageResultExecution timeMemory
1302385tuandqTowers (NOI22_towers)C++20
12 / 100
421 ms73488 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, const int &d) { 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] |= d, ve.pop_back() ; reverse(all(ve)) ; while(!ve.empty() && (ve.back().fi < dw || maskRow[ve.back().fi] == 3)) maskRow[ve.back().fi] |= d, ve.pop_back() ; reverse(all(ve)) ; return !ve.empty() ; } bool makeRow(int idx, const int &d) { 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] |= d, ve.pop_back() ; reverse(all(ve)) ; while(!ve.empty() && (ve.back().fi < le || maskCol[ve.back().fi] == 3)) maskCol[ve.back().fi] |= d, 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, 1)) ++ le ; while(ri >= le && !makeCol(ri, 2)) -- ri ; while(dw <= up && !makeRow(dw, 1)) ++ dw ; while(up >= dw && !makeRow(up, 2)) -- up ; cerr << le << ' ' << ri << ' ' << dw << ' ' << up << endl ; 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) { assert(maskRow[up] != 3) ; 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:199:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  199 |         freopen(taskname".inp", "r", stdin) ;
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:200:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  200 |         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...