Submission #1303399

#TimeUsernameProblemLanguageResultExecution timeMemory
1303399chaitanyamehtaTowers (NOI22_towers)C++20
0 / 100
1002 ms148412 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

struct Edge{
    int v , id;
};
const int maxn = 1e6+1;
vector<vector<Edge>> g;
vector<int> vis , used , par_edge , deg;

void dfs(int u){
    vis[u] = 1;
    for(auto v : g[u]){
        if(v.id == par_edge[u])continue;
        if(!vis[v.v]){
            par_edge[v.v] =  v.id;
            dfs(v.v);
        }
    }
}

void dfs2(int u){
    vis[u] =1;
    for(auto e : g[u]){
        int v = e.v;
        if(vis[v] || par_edge[v] != e.id)continue;
        dfs2(v);

        if(!used[e.id] && deg[u] < 2 && deg[v] < 2){
            used[e.id] = 1;
            deg[u]++;
            deg[v]++;
         }
    }
}


signed main(){
    int n;cin>>n;


    vector<int> x(n) , y(n);
    for(int i = 0 ; i < n; i++)cin>>x[i]>>y[i];

    vector<int> xs = x, ys = y;
    sort(xs.begin() , xs.end());
    xs.erase(unique(xs.begin() , xs.end()) , xs.end());
    sort(ys.begin() , ys.end());
    ys.erase(unique(ys.begin() , ys.end()) , ys.end());

    int nx = xs.size();
    int ny = ys.size();
    vector<int> cx(n) , cy(n);

    for(int i = 0 ; i < n ; i++){
        cx[i] = lower_bound(xs.begin() , xs.end() , x[i]) - xs.begin();
        cy[i] = lower_bound(ys.begin() , ys.end() , y[i]) - ys.begin() + nx;
    }

    int V = nx + ny;

    g.resize(V);
    vis.resize(V , 0);
    used.assign(n , 0);
    deg.resize(V);
    par_edge.assign(V , -1);

    for(int i = 0 ;i < n; i++){
        g[cx[i]].push_back({cy[i] , i});
        g[cy[i]].push_back({cx[i] , i});
    }


    for(int i = 0 ; i < V ; i++){
        if(!vis[i])dfs(i);
    }
    for(int i = 0 ; i< n ;i++){
        int u = cx[i];
        int v = cy[i];
        if(par_edge[u]!=i && par_edge[v]!=i){
            if(deg[u] <2 && deg[v] <2){
                deg[u]++;
                deg[v]++;
                used[i] = 1;
            }
        }
    }
    vis.assign(V , 0);

    for(int i = 0 ; i < V ; i++){
        if(!vis[i]) dfs2(i);
    }

    for(int i = 0 ; i < n; i++){
        cout<<used[i];
    }
}
#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...