제출 #436638

#제출 시각아이디문제언어결과실행 시간메모리
436638Apiram분수 공원 (IOI21_parks)C++17
5 / 100
3568 ms17028 KiB
#include "parks.h"
#include<bits/stdc++.h>
using namespace std;
vector<int>parent(1e6);
vector<int>siz(1e6);
void makesets(int v){
	parent[v]=v;
	siz[v]=1;
}
int findsets (int v){
	if (v==parent[v])return v;
	parent[v]=findsets(parent[v]);
	return parent[v];
}
void unionset(int a,int b){
	a = findsets(a);
	b =findsets(b);
	if (a==b)return;
	if (siz[a]<siz[b])swap(a,b);
	siz[a]+=siz[b];
	parent[b]=a;
}
void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b);
struct point {
	int x,y,index;
};
bool dist(point x,point y){
	if (pow(x.x - y.x,2)+pow(x.y-y.y,2)!=4)return false;
	return true;
}
int binarysearch(int seg,int eq,int n,vector<point>arr){
	int left = 0;
	int right = n-1;
	while(left<=right){
		int mid = (left + right) >> 1;
		if (arr[mid].x<seg)left= mid + 1;
		else if (arr[mid].x>seg)right = mid-1;
		else {
			if (arr[mid].y<eq){
				left=mid+1;
			}
			else if (arr[mid].y>eq){
				right = mid-1;
			}
			else return mid;
		}
	}
	if (left>=0&&left<n)return left;
	return 0;
}
int construct_roads(std::vector<int> x, std::vector<int> y) {
    vector<point>arr;
    int n = x.size();
    bool ok=true;
    
    for (int i = 0 ;i<n;++i){
    	if (x[i]!=x[0])ok=false;
    	arr.push_back({x[i],y[i],i});
    }
    vector<int>ansx,ansy,ansxi,ansyi;
    if (ok){
    sort(arr.begin(),arr.end(),[&](point a,point b){
    	return a.y<b.y;
    });
    
    for (int i = 1;i<n;++i){
    	if (dist(arr[i],arr[i-1])){
    		ansx.push_back(min(arr[i].x,arr[i-1].x) + 1);
    		ansy.push_back(min(arr[i].y,arr[i-1].y)+1);
    		ansxi.push_back(arr[i].index);
    		ansyi.push_back(arr[i-1].index);
    	}
    	else return 0;
    }
    build(ansxi,ansyi,ansx,ansy);
    return 1;}
    else{
    	for (int i =0;i<n;++i){
    		makesets(i);
    	}
    	set<pair<int,int>>p;
    	sort(arr.begin(),arr.end(),[&](point a,point b){
    		if (a.x==b.x)return a.y<b.y;
    		return a.x<b.x;
    });

    	
   	for (int k =0;k<n;++k){
   		if (siz[findsets(0)]==n)break;
    		for (auto j:{max(k-1,0),min(k+1,n-1),binarysearch(arr[k].x+2,arr[k].y,n,arr),binarysearch(arr[k].x-2,arr[k].y,n,arr)}){
    		if (siz[findsets(0)]==n)break;
    		if (j==k)continue;
    		if (dist(arr[j],arr[k])&&findsets(j)!=findsets(k)){
    			int first1=min(arr[k].x,arr[j].x) + 1;
    		int first2=min(arr[k].x,arr[j].x) + 1;
    		int second1=min(arr[k].y,arr[j].y) + 1;
    		int second2 = min(arr[k].y,arr[j].y) - 1;
    		if (arr[j].x==arr[k].x){
    			second2=min(arr[k].y,arr[j].y) + 1;
    			first2 = min(arr[k].x,arr[j].x) - 1;
    		}
    		else if (arr[j].y!=arr[k].y){
    			continue;
    		}
    		if (p.find({first1,second1})==p.end()){
    			ok=true;
    			ansx.push_back(first1);
    			ansy.push_back(second1);
    			ansxi.push_back(arr[j].index);
    			ansyi.push_back(arr[k].index);
    			unionset(j,k);
    			p.insert({ansx.back(),ansy.back()});
    			break;
    		}
    		if (p.find({first2,second1})==p.end()){
    			ok=true;
    			ansx.push_back(first2);
    			ansy.push_back(second1);
    			ansxi.push_back(arr[j].index);
    			ansyi.push_back(arr[k].index);
    			unionset(j,k);
    			p.insert({ansx.back(),ansy.back()});
    			break;
    		}
    		if (p.find({first1,second2})==p.end()){
    			ok=true;
    			ansx.push_back(first1);
    			ansy.push_back(second2);
    			ansxi.push_back(arr[j].index);
    			ansyi.push_back(arr[k].index);
    			unionset(j,k);
    			p.insert({ansx.back(),ansy.back()});
    			break;
    		}
    		if (p.find({first2,second2})==p.end()){
    			ok=true;
    			ansx.push_back(first2);
    			ansy.push_back(second2);
    			ansxi.push_back(arr[j].index);
    			unionset(j,k);
    			ansyi.push_back(arr[k].index);
    			p.insert({ansx.back(),ansy.back()});
    			break;
    		}
    		}
    	
    	
    }
    }
    if (siz[findsets(0)]!=n)return 0;
    	  build(ansxi,ansyi,ansx,ansy);
    	  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...