제출 #1370104

#제출 시각아이디문제언어결과실행 시간메모리
1370104enzyFountain Parks (IOI21_parks)C++20
15 / 100
189 ms50448 KiB
#include "parks.h"
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=2e5+10;

map<pii,int>mp;
vector<int>adj[maxn];
int marc[maxn];

void dfs(int u){
    marc[u]++;
    for(int viz : adj[u]){
        if(marc[viz]) continue;
        dfs(viz);
    }
}

int construct_roads(vector<int> x, vector<int> y){
    int n=x.size();
    for(int i=0;i<n;i++) adj[i].clear(), marc[i]=0;
    vector<pair<int,pii>>ord;
    for(int i=0;i<n;i++) ord.push_back({i,{x[i],y[i]}}), mp[{x[i],y[i]}]=i+1;

    auto cmp=[&](pair<int,pii> z, pair<int,pii> w){
        if(z.se.fi!=w.se.fi) return z.se.fi<w.se.fi;
        if(z.se.se!=w.se.se) return z.se.se<w.se.se;
        return z.fi<w.fi;
    };  

    sort(ord.begin(),ord.end(),cmp);
    vector<int>u, v, a, b;
    for(int i=0;i<n;i++){
        if(i>=1&&ord[i-1].se.fi==ord[i].se.fi&&ord[i-1].se.se+2==ord[i].se.se){
            u.push_back(ord[i-1].fi); v.push_back(ord[i].fi);
            b.push_back((ord[i-1].se.se+ord[i].se.se)/2);
            if(ord[i].se.fi==2) a.push_back(ord[i].se.fi-1);
            else a.push_back(ord[i].se.fi+1);
        }
        if(ord[i].se.fi==2){
            if(mp[{ord[i].se.fi+2,ord[i].se.se}]){
                u.push_back(ord[i].fi); v.push_back(mp[{ord[i].se.fi+2,ord[i].se.se}]-1);
                a.push_back(ord[i].se.fi+1); b.push_back(ord[i].se.se+1);
            }
        }
    }
    for(int i=0;i<u.size();i++){
        // cerr << u[i] << ' ' << v[i] << '\n';
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }
    dfs(0);
    for(int i=0;i<n;i++) if(!marc[i]) return 0;
    build(u,v,a,b);
    return 1;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…