로그인가입

이름표

300점케이스 10출제 dongbinna
10월 30일에 올라온 문제입니다.

문제

일자로 길게 늘어진 하나의 선이 있다. 이 선 위에는 1부터 300,000까지의 각 수가 왼쪽부터 오른쪽까지 차례대로 적혀있다. 각 수의 아래에는 학생들이 이름표를 붙일 수 있는 공간이 존재한다.

총 N명의 학생은 각자 원하는 시작 지점(수)부터 시작하여 원하는 끝 지점(수)까지의 모든 연속된 수 아래에 자신의 이름표를 붙인다. 이때 학생의 수 N은 1 이상 300,000 이하의 값을 가지며, 각 학생에 대하여 구간의 길이는 최대 300,000의 값을 가질 수 있다. 이때, 구간의 길이란 해당 학생이 붙이게 되는 이름표의 개수를 의미한다.

이때, 각 학생에 대하여 [시작 지점 t, 구간의 길이 k] 정보가 주어진다고 해보자. 한 학생의 시작 지점이 500이고, 구간의 길이가 10이라면 500이상 509 이하의 모든 수의 위치에 대하여 자신의 이름표를 붙이는 것이다.

단, 구간을 설정함으로써 범위를 벗어나는 지점에는 이름을 붙이지 않는다. 예를 들어 특정한 학생이 시작 지점을 299,995로 설정하고, 구간의 길이를 100으로 설정한 경우를 생각하자. 이 경우 100개의 위치가 아니라 299,995, 299,996, 299,997, 299,998, 299,999, 300,000까지 총 6개 지점의 위치에 대해서만 이름표를 붙이게 된다.

N명의 학생이 이름표를 모두 붙이고 나면, 이후에 M개의 질의(query)가 수행된다. 질의의 수 M은 최대 100,000이다. 각 질의는 [start, end] 형태로 구성되는데, 구체적으로 start 이상 end 이하의 모든 수에 대하여 그 수의 아래에 존재하는 이름표 개수의 합을 구하는 것을 의미한다. 단, start는 1 이상 300,000 이하의 자연수다. 또한 end는 start 이상 300,000 이하의 자연수다. M개의 질의(query)에 대하여 각각 구간에 속한 이름표의 개수의 총 합을 계산하고, 그 결과를 크기가 M인 1차원 배열로 반환하는 프로그램을 작성하여라.

예를 들어 N=5, M=3이고, 각 학생이 선에 이름표를 거는 작업에 대한 정보가 다음의 표와 같다고 해보자.

학생 번호1번2번3번4번5번
시작 지점36213
구간의 길이23854

위 예시와 같이 1번부터 5번 학생까지 차례대로 이름표를 걸었다고 해보자. 그러면 선 위의 각 수(위치)에 대하여 다음과 같이 이름표들이 걸리게 될 것이다.

위치 1위치 2위치 3위치 4위치 5위치 6위치 7위치 8위치 9
1번1번2번2번2번
3번3번3번3번3번3번3번3번
4번4번4번4번4번
5번5번5번5번

이후에 각 3개의 쿼리에 대한 정보가 차례대로 [3, 7], [7, 9], [2, 5]라고 가정하자. 이때 각 쿼리에 대한 정답을 포함해 표 형태로 정리하여 나타내면 다음과 같다.

쿼리 번호1번2번3번
시작 지점372
끝 지점795
정답16513

따라서, 현재 예시에서는 [16, 5, 13]이 정답이다.

입출력 예시

예시 1

입력

5, 3, [[3, 2], [6, 3], [2, 8], [1, 5], [3, 4]], [[3, 7], [7, 9], [2, 5]]

출력

[16, 5, 13]

입력 조건

  • 가장 먼저 학생의 수 N이 주어진다. N은 3 이상 300,000 이하의 자연수다.

  • 이어서 쿼리의 수 M이 주어진다. M은 1 이상 100,000 이하의 자연수다.

  • 이어서 각 학생이 이름표를 거는 작업에 대한 정보가 담긴 N×2 크기의 배열 students가 주어진다. 각 원소는 [t, k] 형태로 주어지며, 시작 지점 t는 1 이상 300,000 이하의 자연수다. k는 구간의 길이를 의미하며, 1 이상 300,000 이하의 자연수다.

  • 이어서 각 질의(query) 정보가 담긴 M×2 크기의 배열 queries가 주어진다. 각 원소는 [start, end] 형태로 주어지며, start는 1 이상 300,000 이하의 자연수를 의미하고, end는 start 이상 300,000 이하의 자연수를 의미한다.

출력 조건

  • M개의 질의(query)에 대하여 각각 구간에 속한 이름표의 개수의 총 합을 계산하고, 그 결과를 크기가 M인 1차원 배열로 반환한다.

요구사항

  • solution(N, M, students, queries) 함수를 만들고 답을 반환해야 합니다
  • 쓸 수 있는 말은 파이썬, 자바스크립트입니다
  • 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
  • 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
  • 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
  • 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
  • 케이스는 10개이고, 그 가운데 1개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
  • 케이스 10개를 전부 통과해야 해결입니다.
문제의 요구 사항을 잘 읽고 해결해 주세요. 단, 채점 과정을 건드려 통과한 것처럼 꾸미는 경우 적발 시 제재될 수 있습니다. 제출한 코드는 순위표에 함께 공개됩니다.

예시

공개 케이스 1개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 10개를 전부 통과해야 해결입니다.

입력
기대 출력
5, 3, [[3, 2], [6, 3], [2, 8], [1, 5], [3, 4]], [[3, 7], [7, 9], [2, 5]]
[16, 5, 13]

참고 사항

풀이에 도움이 되는 배경입니다. 지켜야 하는 규격은 위의 입출력 조건과 요구사항에 있습니다.

원본에서 모의고사 8회 2번입니다.

풀이

코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.

0자1줄메모리 256MB (적어만 둡니다)기준 62ms

제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.

공개 케이스 1개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.

이 문제를 푼 사람

아직 없습니다. 첫 번째가 되실 수 있습니다.