ps:problems:boj:5419
북서풍
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 5419 |
문제명 | 북서풍 |
레벨 | 플래티넘 4 |
분류 |
Order Statistic Tree |
시간복잡도 | O(T * nlogn) |
인풋사이즈 | n <= 75000, T <= ??? |
사용한 언어 | Python |
제출기록 | 59548KB / 4240ms |
최고기록 | 4240ms |
해결날짜 | 2021/04/09 |
태그 |
풀이
- 기본적인 Inversion Counting 문제.
- 좌표의 범위가 크므로 좌표 압축이 필요하다
- 시간 복잡도는 O(nlogn)..인데 테스트 케이스가 여러개이다.
- 테스트 케이스의 갯수가 주어지지 않는데 수가 적지는 않은것 같다. n의 범위가 75000이하밖에 안되는데도 Python으로는 시간이 상당히 빡빡하다. 처음에는 Python으로는 포기하고 PyPy로 제출했었는데. 그 뒤에 python3으로 통과한 사람이 생긴 것을 보고서 나도 조금 더 최적화를 하다보니 아슬아슬하게 시간 내에 들어왔다. 좌표 압축하는 루틴을 작성할때 보통은 가독성을 위해서 set을 이용해서 중복값을 제거하거나, itertools.groupby를 써서 중복값을 처리하거나 하는 방식으로 해왔는데, 이번에는 그냥 수작업으로 풀어서 처리했다.
코드
"""Solution code for "BOJ 5419. 북서풍".
- Problem link: https://www.acmicpc.net/problem/5419
- Solution link: http://www.teferi.net/ps/problems/boj/5419
"""
import operator
import sys
from teflib import fenwicktree
def main():
t = int(sys.stdin.readline())
for _ in range(t):
n = int(sys.stdin.readline())
points = [[int(x) for x in sys.stdin.readline().split()]
for _ in range(n)]
points.sort(key=operator.itemgetter(1))
compressed_y = 0
prev = points[0][1]
for point in points:
if point[1] != prev:
prev = point[1]
compressed_y += 1
point[1] = compressed_y
answer = 0
fenwick = fenwicktree.FenwickTree(n)
for _, y in sorted(points, key=lambda p: -p[0]):
answer += fenwick.query(0, y + 1)
fenwick.update(y, 1)
print(answer)
if __name__ == '__main__':
main()
- Dependency: teflib.fenwicktree.FenwickTree
ps/problems/boj/5419.txt · 마지막으로 수정됨: 2021/05/05 16:35 저자 teferi
토론