일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 에라토스테네스의 체
- 세그먼트트리
- lis
- 누적합
- 백준
- 이진탐색
- 좌표압축
- 정렬
- LazyPropagation
- 플로이드와샬
- 이분매칭
- lca
- dfs
- 수학
- BFS
- DP
- 삼분탐색
- 다익스트라
- 비트마스크
- MST
- 투포인터
- 펜윅트리
- 그리디
- 위상정렬
- 구현
- 브루트포스
- 이분탐색
- boj
- DisjointSet
- 크루스칼
Archives
- Today
- Total
lastknight00
[백준]대한민국(3770) 본문
문제 링크 : [백준]대한민국(3770)
문제 설명
왼쪽 도시에서 오른쪽 도시로 연결하는 고속도로들 중 교차점의 갯수를 구하세요.
입력
T(테스트 케이스 수)
N(왼쪽 도시 갯수, 1 <= N <= 1,000)
M(오른쪽 도시 갯수, 1 <= M <= 1,000)
K(고속도로 갯수, 1 <= K <=400,000)
Ai Bi(고속도로 정보, 왼쪽 도로 중 Ai번째 도시와 Bi도시가 연결 됨)
1
3 4 4
1 4
2 3
3 2
3 1
출력
Test case 1: 5
카테고리
#세그먼트트리 #펜윅트리
시간 복잡도 상한
O(KlogK)
해결 방법
- 왼쪽 지점에서 오른쪽 지점으로 연결하는 선 중 교차하는 지점을 찾는 문제입니다.
- 교차하는 지점은 왼쪽에서는 상대적으로 위쪽에 있었으나, 오른쪽에서 상대적으로 아래쪽에 있는 지점들의 갯수를 세면 됩니다.
- 왼쪽에서 맨 위에 있던 지점과 오른쪽에서 위에서 두번째 있는 지점과
- 왼쪽에서 위에서 두번째에 있는 지점과 오른쪽에서 맨 위에 있는 지점을 연결하는 선은 교차하게 됩니다.
- 왼쪽 지점을 기준으로 선을 정렬합니다.
- 정렬된 선들을 차례대로 방문하면서 현재 도로의 오른쪽 지점보다 아래에 있는 오른쪽 지점이 이전에 몇개나 나왔었는지를 셉니다.
- 3번에서 왼쪽 지점을 기준으로 정렬했기 때문에, 4번에서 세는 지점의 갯수는 2번에서 설명한 지점의 갯수가 됩니다.
- 누적합으로 갯수를 세면 되지만 값이 빈번히 변경되기 때문에 세그먼트 트리나 펜윅트리를 이용하여 문제를 풉니다.
- 단, 왼쪽에서 같은 지점일 경우, 오른쪽을 내림차순으로 정렬하여야 중복 카운팅이 되지 않습니다.
- 아래 코드는 반대로 정렬하였습니다.
시간복잡도
O(Klog(max(N,M)))
코드
#include<iostream>
#include<algorithm>
#include<string.h>
#define F first
#define S second
using namespace std;
typedef pair<int,int>P;
typedef long long L;
int t,c,n,m,k,i,e[1001];
L a;
P d[400001];
void u(int p){
while(p<=n)e[p]++,p+=p&-p;
}
int q(int p){
int s=0;
while(p)s+=e[p],p-=p&-p;
return s;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>t;
for(c=1;c<=t;c++){
memset(e,0,sizeof(e));
cin>>n>>m>>k;
for(i=0;i<k;i++)cin>>d[i].F>>d[i].S,d[i].F*=-1,d[i].S*=-1;
sort(d,d+k);
for(a=i=0;i<k;i++){
a+=q(-d[i].S-1);
u(-d[i].S);
}
cout<<"Test case "<<c<<": "<<a<<"\n";
}
}
'PS' 카테고리의 다른 글
[백준]무한이진트리(2078) (0) | 2020.10.02 |
---|---|
[백준]기업투자(2662) (0) | 2020.09.27 |
[백준]소가 길을 건너간 이유 11(14459) (0) | 2020.09.22 |
[백준]우체국(2285) (0) | 2020.09.13 |
[백준]블록 쌓기(9998) (0) | 2020.09.13 |
Comments