staticintparent[],rank[];staticintfind(intu){if(u==parent[u]){returnu;}returnparent[u]=find(parent[u]);}staticvoidmerge(intu,intv){u=find(u);v=find(v);if(u==v){return;}// u - > v merging// tree depth 낮은게 높은 tree로 가야 tree depth가 변하지 않는다if(rank[u]>rank[v]){// cording을 편하게 하기 위해//swap(u, v);inttemp=u;u=v;v=temp;}parent[u]=v;if(rank[u]==rank[v]){rank[v]++;}}
원점 기준으로 벡터 B가 벡터 A의 반시계 방향이면 양수, 시계 방향이면 음수, 평행이면 0을 반환한다
vectorcross(vectorA,vectorB){//외적returnvector(A.x*B.y-B.x*A.y)}doubleccw(vectorA,vectorB){//원점을 기준으로 CounterClockWisereturncross(A,B)}doubleccw(vectorbase,vectorA,vectorB){//base를 기준으로 ccw 판단ccw(A-base,B-base)}