Submission #1255309

#TimeUsernameProblemLanguageResultExecution timeMemory
1255309ereringFountain Parks (IOI21_parks)C++20
15 / 100
356 ms60136 KiB
#include <bits/stdc++.h>
#include "parks.h"
using namespace std;
#define pb push_back
const int MAXN=2e5+5;
int cnt[MAXN];
vector<int> adj[MAXN];
bool vis[MAXN];
void dfs(int node){
    if(vis[node])return;
    vis[node]=1;
    for(auto i:adj[node])dfs(i);
}
int construct_roads(std::vector<int> x, std::vector<int> y) {
    if (x.size() == 1) {
	build({}, {}, {}, {});
        return 1;
    }
    map<pair<int,int>,int> exist;
    vector<int> vec[7];
    for(int i=0;i<x.size();i++){
        exist[{x[i],y[i]}]=i+1;
        vec[x[i]].pb(y[i]);
    }
    sort(vec[2].begin(),vec[2].end());
    sort(vec[4].begin(),vec[4].end());
    sort(vec[6].begin(),vec[6].end());
    std::vector<int> u, v, a, b;
    for(int i=1;i<vec[2].size();i++){
        if(vec[2][i-1]+2==vec[2][i]){
            u.pb(exist[{2,vec[2][i-1]}]);
            v.pb(exist[{2,vec[2][i]}]);
            a.pb(1);
            b.pb(vec[2][i-1]+1);
        }
    }
    for(int i=1;i<vec[6].size();i++){
        if(vec[6][i-1]+2==vec[6][i]){
            u.pb(exist[{6,vec[6][i-1]}]);
            v.pb(exist[{6,vec[6][i]}]);
            a.pb(7);
            b.pb(vec[6][i-1]+1);
        }
    }
    cnt[0]=1;
    map<pair<int,int>,bool> taken;
    for(int i=1;i<vec[4].size();i++){
        cnt[i]=1;
        if(vec[4][i-1]+2==vec[4][i]){
            cnt[i]+=cnt[i-1];
            u.pb(exist[{4, vec[4][i - 1]}]);
            v.pb(exist[{4, vec[4][i]}]);
            b.pb(vec[4][i - 1] + 1);
            if(cnt[i]%2==0)a.pb(3);
            else a.pb(5);
            taken[{a.back(),b.back()}]=1;
        }
    }
    for(int i=0;i<vec[4].size();i++){
        int j=exist[{2,vec[4][i]}];
        if(j){
            if(!taken[{3,vec[4][i]-1}]){
                taken[{3,vec[4][i]-1}]=1;
                u.pb(j);
                v.pb(exist[{4,vec[4][i]}]);
                a.pb(3);
                b.pb(vec[4][i]-1);
            }
            else if(!taken[{3,vec[4][i]+1}]){
                taken[{3,vec[4][i]+1}]=1;
                u.pb(j);
                v.pb(exist[{4,vec[4][i]}]);
                a.pb(3);
                b.pb(vec[4][i]+1);
            }
        }
        j=exist[{6,vec[4][i]}];
        if(j){
            if(!taken[{5,vec[4][i]-1}]){
                taken[{5,vec[4][i]-1}]=1;
                u.pb(j);
                v.pb(exist[{4,vec[4][i]}]);
                a.pb(5);
                b.pb(vec[4][i]-1);
            }
            else if(!taken[{3,vec[4][i]+1}]){
                taken[{5,vec[4][i]+1}]=1;
                u.pb(j);
                v.pb(exist[{4,vec[4][i]}]);
                a.pb(5);
                b.pb(vec[4][i]+1);
            }
        }
    }
    for(int i=0;i<v.size();i++){
        u[i]--;
        v[i]--;
        adj[u[i]].pb(v[i]); adj[v[i]].pb(u[i]);
    }
    dfs(0);
    for(int i=0;i<x.size();i++){
        if(!vis[i]){
            return 0;
        }
    }
    build(u, v, a, b);
    return 1;
}
#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...