http://acmicpc.net/problem/20943
20943번: 카카오톡
카카오톡은 주식회사 카카오가 2010년 3월 18일 서비스를 시작한 글로벌 모바일 인스턴트 메신저로, 2020년 기준 $4\,000$만 명의 사용자가 등록돼 있고 시장 점유율이 $96$%로 사실상 거의 모든 국민
www.acmicpc.net
map을 사용해 푸는 문제였습니다.
교차하는 두 직선의 쌍을 구하는 문제였습니다. ax+by+c꼴로 주어지는데 결과적으로 기울기는 a/b가 됩니다.
두직선은 기울기가 같지않는 이상 교차하기때문에 각각 기울기로 분류하면됩니다. 실수계산을 피하기 위해서 a와 b의 최대공약수로 나눠준 a,b값을 pair로써 map의 key값으로 사용했고 각각 a=0 인경우 b=0인경우를 나눠서 구했습니다.
#include<stdio.h>
#include<queue>
#include<vector>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<algorithm>
using namespace std;
void fast_io() {
cin.tie(0)->sync_with_stdio(0);
}
int gcd(int x,int y){
if(y==0){
return x;
}
else{
return gcd(y,x%y);
}
}
map<pair<int,int>,int> m;
int main(){
fast_io();
int N;
cin>>N;
long long now=0;
long long solve=0;
long long now2=0;
long long now3=0;
for(int x=0;x<N;x++){
int a,b,c;
cin>>a>>b>>c;
if(a==0){
now2++;
continue;
}
if(b==0){
now3++;
continue;;
}
int k=gcd(abs(a),abs(b));
long long ta=a/k;
long long tb=b/k;
if(ta*tb<0){
m[{abs(ta),-abs(tb)}]++;
}
else m[{abs(ta),abs(tb)}]++;
}
long long k=N;
N-=now2+now3;
for(auto i : m){
now+=i.second;
solve+=(long long)((long long)N-now)*(long long)i.second;
}
solve+=(long long)(k-now2-now3)*now2;
solve+=(long long)(k-now2-now3)*now3;
solve+=now2*now3;
cout<<solve;
}
'PS > boj' 카테고리의 다른 글
백준 16238 독수리 (0) | 2022.08.04 |
---|---|
백준 1525 퍼즐 (0) | 2022.08.03 |
백준 2629 양팔저울 (0) | 2022.07.26 |
백준 23759 비슷한 문자열 (0) | 2022.07.25 |
백준 17398 통신망 분할 (0) | 2022.07.24 |