DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

선분과 삼각형

문제로 돌아가기

해설

직선 PQPQPQ의 한쪽에 있는 점의 수를 n+n_+n+​, 반대쪽에 있는 점의 수를 n−n_-n−​라 하자. 세 꼭짓점이 모두 같은 쪽에 있는 삼각형은 선분 PQPQPQ와 만나지 않으므로 관계 4에 해당한다. 이러한 삼각형은 (n+3)+(n−3)\binom{n_+}{3}+\binom{n_-}{3}(3n+​​)+(개이다.

이제 두 쪽에 모두 꼭짓점이 있는 삼각형을 생각하자. 한쪽에 꼭짓점 UUU가 하나 있고 반대쪽에 두 꼭짓점 V,WV,WV,W가 있다고 하자. 직선 UVUVUV와 직선 PQPQPQ의 교점 위치를 다음과 같이 분류한다.

  • LLL: 교점이 PPP보다 앞에 있다.
  • MMM: 교점이 선분 PQPQPQ의 내부에 있다.
  • RRR: 교점이 QQQ보다 뒤에 있다.

UWUWUW도 같은 방법으로 분류한다. 두 교점은 삼각형과 직선 PQPQPQ가 만나는 구간의 양 끝점이다. 따라서 두 분류에 따라 삼각형의 관계가 다음과 같이 정해진다.

  • L,RL,RL,R: 관계 1.
  • L,ML,ML,M 또는 M,RM,RM,R: 관계 2.
  • M,MM,MM,M: 관계 3.
  • 또는 : 관계 4.

고정한 UUU에 대하여 반대쪽 점 중 분류가 L,M,RL,M,RL,M,R인 점의 수를 각각 lU,mU,rUl_U,m_U,r_UlU​,m라 하자. 이 꼭짓점이 한쪽에 혼자 있는 삼각형들이 네 관계에 기여하는 수는 순서대로 다음과 같다.

lUrU,mU(lU+rU),(mU2),(lU2)+(rU2).l_Ur_U,\qquad m_U(l_U+r_U),\qquad \binom{m_U}{2},\qquad \binom{l_U}{2}+\binom{r_U}{2}.lU​rU​

두 쪽에 모두 꼭짓점이 있는 삼각형에는 한쪽에 혼자 있는 꼭짓점이 유일하므로, 모든 UUU에 대해 이 값을 더하면 각 삼각형을 정확히 한 번 센다.

lU,mU,rUl_U,m_U,r_UlU​,mU​,rU​를 빠르게 구하자. 좌표계에 아핀 변환을 적용하여 P=, 이라 생각해도 된다. 점 에 대해

aX=xXyX,bX=xX−1yXa_X=\frac{x_X}{y_X},\qquad b_X=\frac{x_X-1}{y_X}aX​=yX​

를 정의한다. 일반 위치 조건에 의해 모든 yXy_XyX​는 000이 아니며, 정렬 과정에서 같은 값도 생기지 않는다.

UUU가 직선 PQPQPQ의 위쪽에 있다면

lU=#{V:aV>aU},rU=#{V:bV<bU}l_U=\#\{V:a_V>a_U\},\qquad r_U=\#\{V:b_V<b_U\}lU​=#{V:aV​

이다. 여기서 VVV는 항상 UUU의 반대쪽 점만을 뜻한다. UUU가 아래쪽에 있다면 부등호 방향이 모두 반대가 된다. 따라서 모든 점을 aXa_XaX​ 순서로 정렬하고 양쪽 점의 누적 개수를 세면 모든 lUl_U를 구할 수 있다. 모든 점을 순서로 다시 정렬하면 모든 를 구할 수 있다. 마지막으로

mU=(U의 반대쪽 점 수)−lU−rUm_U=(U\text{의 반대쪽 점 수})-l_U-r_UmU​=(U의 반대쪽 점 수)−lU​

이다.

나눗셈과 부동소수점은 필요하지 않다. d⃗=Q−P\vec d=Q-Pd=Q−P라 하자. 기준점 BBB가 PP 또는 일 때 다음 분수를 정렬하면 각각 , 의 순서를 얻는다.

d⃗⋅(X−B)d⃗×(X−P)\frac{\vec d\cdot(X-B)}{\vec d\times(X-P)}d×(X−P)

분모가 음수이면 분자와 분모의 부호를 함께 바꾸고, 두 분수는 교차 곱으로 비교한다. 좌표 범위 때문에 교차 곱에는 부호 있는 128비트 정수가 필요하다.

두 번의 정렬이 필요하므로 시간 복잡도는 O(Nlog⁡N)O(N\log N)O(NlogN)이고, 공간 복잡도는 O(N)O(N)O(N)이다.

Solution written by GPT5

3
n−​
​
)
L,LL,L
L,L
R,RR,RR,R
U
​
,
rU​
,
mU​
(
lU​
+
rU​),(2mU​​),(2lU​​)+
(2rU​​).
(0,0)P=(0,0)
P=(0,0)
Q=(1,0)Q=(1,0)Q=(1,0)
X=(xX,yX)X=(x_X,y_X)X=(xX​,yX​)
xX​
​
,
bX​
=
yX​xX​−1​
>
aU​},rU​=
#{V:
bV​<
bU​}
lU​
bXb_XbX​
rUr_UrU​
−
rU​
P
QQQ
aXa_XaX​
bXb_XbX​
d⋅(X−B)
​