Logo
(追記) (追記ここまで)

27973번 - 지연 평가

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 1024 MB73041634158.092%

문제

지연이는 자신이 가진 배열 $S$의 상태를 평가하려고 한다. 처음에 $S$에는 1ドル$부터 1ドル ,円 234 ,円 567 ,円 890 ,円 123$까지의 모든 정수가 1ドル$개씩 들어 있다.

지연이를 도와 다음 명령을 수행하는 프로그램을 작성하시오.

  • 0 x: $S$의 모든 원소에 x를 더한다. $(-100 ,円 000 \leq$ x $\leq 100 ,円 000)$
  • 1 x: $S$의 모든 원소에 x를 곱한다. $(1 \leq$ x $\leq 100)$
  • 2 n: $S$에서 작은 원소부터 차례대로 n개를 제거한다. $(1 \leq$ n $\leq 100 ,円 000 ,円 000)$
  • 3: $S$에서 가장 작은 원소를 출력한다.

이 문제의 풀이를 작성하기 전에, 예제 밑의 힌트를 참조할 수 있다.

입력

첫 줄에 명령의 개수 $Q$가 주어진다. $(1 \leq Q \leq 170 ,円 000)$

다음 줄부터 위에서 설명한 네 개의 명령 중 하나가 주어진다. x, n은 정수이다.

하나의 테스트케이스에서 2번 명령으로 들어오는 모든 n의 합은 1ドル ,円 234 ,円 567 ,円 890 ,円 120$ 이하이다.

하나의 테스트케이스에서 배열 $S$에 들어 있는 어떤 수든지 그 절댓값이 언제나 10ドル^{18}$ 이하가 되도록 하는 명령만이 주어진다.

마지막 명령은 항상 3이다.

출력

3번 명령이 들어올 때마다 그 시점에서 $S$에서 가장 작은 값을 한 줄에 하나씩 출력한다.

제한

예제 입력 1

10
3
2 999999
3
1 2
3
0 2
1 2
0 2
2 7
3

예제 출력 1

1
1000000
2000000
4000034

예제 입력 2

9
3
0 -10000
3
2 100000000
3
1 99
3
2 8244353
3

예제 출력 2

1
-9999
99990001
9899010099
10715201046

이 예제의 출력에 등장하는 마지막 2개의 수는 32bit 정수 자료형에 담길 수 없다.

예제 입력 3

12
0 1
1 2
2 3
3
0 5
1 6
2 7
3
0 9
1 10
2 11
3

예제 출력 3

10
174
3150

힌트

Python 사용자라면, 간단한 테스트로 다음 두 프로그램을 로컬에서 돌려 보자.

a = [0] * (10 ** 15) # 10**15 byte is 1 Petabyte
print("calculating done!")
a = range(10 ** 15)
print("calculating done!")

두 번째 프로그램은 바로 끝나지만, 첫 번째 프로그램은 메모리 에러가 발생하는 것을 알 수 있다. 이는 range(10 ** 15) 구문이 0ドル$부터 10ドル^{15} - 1$까지의 모든 수를 즉시 생성하는 구문이 아니기 때문이다! 대신, 이 객체는 일단 어딘가에 이 모든 수가 만들어져 있다고 가정하고, 필요할 때마다 수를 0ドル,ドル 1ドル,ドル 2ドル,ドル 3ドル,ドル ... 순으로 만들어서 준다. 따라서 파이썬의 range 객체는 실제로는 start, stop, step이라는 단 3개의 정수만을 내부에 저장하고 있다. 이처럼 결과가 필요할 때까지 표현식의 평가를 미루어 두는 기법을 지연 평가(Lazy evaluation)라고 한다. 만약 실제로 10ドル^{15}$까지의 수가 모두 필요한 것이 아니라면(예를 들어, 100ドル$번째 소수를 발견했을 때 for문을 멈추고 그 값을 리턴하고 싶다면), 지연 평가가 많은 도움이 된다. 마찬가지로 이 문제를 풀기 위해서 1ドル$부터 1ドル,234円,567円,890円,123円$까지의 모든 자연수를 하나씩 직접 생성한다면 시간과 메모리를 엄청나게 잡아먹을 것이다. 지연 평가를 사용해서 이 문제를 보다 효율적으로 풀 수 있는 방법을 찾아보자.

출처

Contest > BOJ User Contest > 와쿠(AGCU)컵 > 제1회 와쿠(AGCU)컵 O번

(追記) (追記ここまで)

출처

대학교 대회

  • 사업자 등록 번호: 541-88-00682
  • 대표자명: 최백준
  • 주소: 서울시 서초구 서초대로74길 29 서초파라곤 412호
  • 전화번호: 02-521-0487 (이메일로 연락 주세요)
  • 이메일: contacts@startlink.io
  • 통신판매신고번호: 제 2017-서울서초-2193 호

AltStyle によって変換されたページ (->オリジナル) /