Submission #1236431

#TimeUsernameProblemLanguageResultExecution timeMemory
1236431AlperenT_Fountain Parks (IOI21_parks)C++20
0 / 100
13 ms23876 KiB
#include <bits/stdc++.h> #include "parks.h" #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define pb push_back #define F first #define pii pair<int,int> #define all(a) a.begin(),a.end() #define S second #define sz(a) (int)a.size() #define rep(i , a , b) for(int i = (a) ; i <= (b) ; i++) #define per(i , a , b) for(int i = (a) ; i >= (b) ; i--) #define ld double #define ll long long using namespace std ; const int maxn = 1e6 + 10 , inf = 1e9+ 10 , mod = 998244353; map <pii ,int> mp ; map <int ,pii> mp2 ; int cnt , dx[] = {2,-2, 0 , 0} , dy[] = {0 , 0 ,2 ,-2} ; void add(int x, int y){ if(mp[{x,y}] == 0){ mp[{x,y}] = cnt ; mp2[cnt] = {x,y} ; cnt++; } } int par[maxn] , d[maxn] , mark[maxn] , mc[maxn]; vector <int> G[maxn] ; int find(int v){ if(par[v] == 0)return v; return par[v] = find(par[v]) ; } void addedge(int v ,int u){ G[v].pb(u); G[u].pb(v); d[v]++; d[u]++; } void dfs(int v , int d =0 ){ mark[v] =1 ; for(int u : G[v]){ if(mark[u] == 1)continue ; if(d==0)mc[v] = u ; dfs(u , d^1) ; } } int construct_roads(std::vector<int> x, std::vector<int> y){ cnt =sz(x) +1 ; vector <pii> vec ; rep(i , 1, sz(x)){ mp[{x[i-1],y[i-1]}] = i ; } vector <pii> ed ; rep(i , 0 , sz(x)-1){ rep(j , 0 , 3){ int a = x[i] + dx[j] , b = y[i] + dy[j] ; if(mp[{a,b}] ==0)continue ; ed.pb({mp[{x[i],y[i]}] , mp[{a,b}]}) ; if(j <= 1){ add((a+x[i])/2 , b-1); add((a+x[i])/2 , b+1); }else{ add(a-1 , (b+y[i])/2); add(a+1 , (b+y[i])/2); } } } int ted= 0; vector <int> V,U ; rep(i ,0 , sz(ed)-1){ int v = ed[i].F, u = ed[i].S ; if(find(v)==find(u))continue ; if(x[v-1] == x[u-1]){ addedge(mp[{x[v-1]-1 , (y[v-1]+y[u-1])/2}] , ted) ; addedge(mp[{x[v-1]+1 , (y[v-1]+y[u-1])/2}] , ted) ; }else{ addedge(mp[{(x[v-1]+x[u-1])/2, y[v-1]-1}] , ted) ; addedge(mp[{(x[v-1]+x[u-1])/2, y[v-1]+1}] , ted) ; } par[find(v)] = find(u) ; V.pb(v); U.pb(u); ted++; } if(ted != sz(x)-1){ return 0 ; } queue <int> q ; rep(i , ted ,cnt){ if(d[i] == 1){ q.push(i) ; } } while(sz(q)){ int v =q.front() ;q.pop() ; cout << v << "\n"; if(mark[v] == 1)continue ; mark[v] =1 ; int x= -1 ; for(int u : G[v]){ if(mark[u] == 1)continue ; x = u ; } if(x==-1)continue ; mark[x] =1 ; mc[x] = v ; for(int w : G[x]){ if(d[w] ==2){ q.push(w); } d[w]-- ; } } int o =0 ; rep(i , 0 ,ted-1){ if(mark[i] == 0){ o++; if(d[i] != 2)return 0 ; } } rep(i , ted , cnt){ if(sz(G[i]) && mark[i] == 0){ o--; } } if(o != 0){ return 0 ; } rep(i , 0 , ted-1){ if(mark[i] == 1)continue ; dfs(i) ; } vector <int> A,B ; rep(i ,0 ,ted-1){ A.pb(mp2[mc[i]].F); B.pb(mp2[mc[i]].S); } build(V,U,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...