wnsgur1714   4년 전

세그먼트 트리를 만들고 이를 내림차순으로 정렬해서 순차탐색하여 찾는 값을 넘는 경우에 남은 숫자들의 개수를 더했는데요....

제 코드가 시간초과가 걸립니다.

제가 생각하기에 세그먼트 트리를 만들고 내림차순으로 정렬하는 것 때문에 걸리는 게 아니라 일부 테스트 케이스에서 순차탐색 때문에 시간이 초과되는 것 같습니다. 

탐색에 걸리는 시간을 더 줄일 수 있는 방법이 있을까요?

djm03178   4년 전

일단 이 문제는 세그먼트 트리의 일종인 머지소트 트리를 사용해서 효율적으로 해결할 수 있는 문제입니다.

그리고 sync_with_stdio에 아무런 인자를 주지 않으면 기본 인자가 true가 되기 때문에 안 쓰는 것과 아무런 차이가 없습니다. false를 인자로 줘야 합니다.

그리고 endl을 쓰면 cin.tie(0)도 무용지물이 됩니다. cin이 호출될 때마다 cout이 flush되는 것을 막으려고 cin.tie(0)을 쓴 건데, endl을 쓰면 cout가 강제로 flush되기 때문입니다. '\n'을 대신 사용하세요.

wnsgur1714   4년 전

그렇다면 

순차 탐색 대신 이분 탐색을 쓰고,

sync_with_stdio(false);를 바꾸고,

endl을 "\n"로 바꾸면 시간 초과가 해결되나요?

아니면 아예 알고리즘이 잘못된 건가요?

wnsgur1714   4년 전

해결됬습니다!

처음에는 직접 이분 탐색을 쓰니 시간 초과가 걸렸었는데, upper_bound로 쓰니 해결되네요. 

감사합니다!

댓글을 작성하려면 로그인해야 합니다.