Submission #1147450

#TimeUsernameProblemLanguageResultExecution timeMemory
1147450PacybwoahTowers (NOI22_towers)C++20
100 / 100
465 ms159792 KiB
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string>
#include<set>
using namespace std;
typedef long long ll;
int inf = 1e9;
const int maxn = 1000005;
set<pair<int, int>> sx[maxn]; // (y, id)
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    vector<pair<int, int>> pts(n), cur(maxn);
    for(int i = 0; i < n; i++) cin >> pts[i].first >> pts[i].second;
    string ans(n, '0');
    vector<vector<pair<int, int>>> allx(maxn);
    for(int i = 0; i < n; i++) allx[pts[i].second].emplace_back(pts[i].first, i);
    vector<int> left(n, -1), rht(n, -1);
    for(int i = 1; i < maxn; i++){
        if(!allx[i].empty()){
            sort(allx[i].begin(), allx[i].end());
            int sz = (int)allx[i].size();
            for(int j = 0; j < sz - 1; j++){
                rht[allx[i][j].second] = allx[i][j + 1].second;
                left[allx[i][j + 1].second] = allx[i][j].second;
            }
            cur[i] = make_pair(allx[i][0].first, allx[i][sz - 1].first);
            sx[cur[i].first].emplace(i, allx[i][0].second);
            if(sz > 1) sx[cur[i].second].emplace(i, allx[i][sz - 1].second);
        }
    }
    queue<int> q;
    for(int i = 1; i < maxn; i++){
        if((int)sx[i].size() > 2) q.push(i);
    }
    while(!q.empty()){
        int x = q.front();
        //cout << x << "\n";
        q.pop();
        int sz = (int)sx[x].size();
        if(sz <= 2) continue;
        auto iter = next(sx[x].begin());
        int nxt;
        for(int i = 1; i < sz - 1; i++){
            auto [y, id] = (*iter);
            iter = next(iter);
            if(cur[y].first == x){
                nxt = rht[id];
                if(nxt == -1) continue;
                cur[y].first = pts[nxt].first;
                sx[cur[y].first].emplace(y, nxt);
                if((int)sx[cur[y].first].size() > 2) q.push(cur[y].first);
            }
            else{
                nxt = left[id];
                if(nxt == -1) continue;
                cur[y].second = pts[nxt].first;
                sx[cur[y].second].emplace(y, nxt);
                if((int)sx[cur[y].second].size() > 2) q.push(cur[y].second);
            }
        }
        while(sz > 2){
            sz--;
            sx[x].erase(next(sx[x].begin()));
        }
    }
    for(int x = 1; x < maxn; x++){
        for(auto &[y, id]: sx[x]){
            ans[id] = '1';
        }
    }
    cout << ans << "\n";
}
// g++ -std=c++20 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run pC.cpp
#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...