※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 11735번 문제인 정산소이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/11735
11735번: 정산소
가리송과 안드레송은 정산소에서 일하고 있고, 미래를 예측하고자 한다. 둘에게는 큰 n x n 정사각형이 주어진다. 처음에 각 배열의 원소 (x,y)는 x + y 로 채워져있다. (1 ≤ x, y ≤ n). 미래 예측
www.acmicpc.net
총 N개의 행이 있는 사각형에서 K번 행에 적혀있는 수들의 합은 다음과 같이 나타낼 수 있다.
(1~N의합 - (사라진 열의 번호들의 합)) + (K*(남아있는 열의 개수))
사라진 열의 번호들의 합과 남아있는 열의 개수는 쿼리 하나당 O(1)에 갱신이 가능하다.
K번 열에 적혀있는 수들의 합도 마찬가지 방식으로 계산해낼 수 있다.
답이 32비트 정수 자료형으로 담을 수 없는 큰 값이 나올 수 있으므로 64비트 자료형을 이용하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
ll N, Q;
ll rCnt, cCnt;
ll rSum, cSum;
bool delR[1000001], delC[1000001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> Q;
rCnt = cCnt = N;
rSum = cSum = N * (N + 1) / 2;
while (Q--) {
char c; ll x; cin >> c >> x;
if (c == 'R') {
if (delR[x]) {
cout << 0 << '\n';
continue;
}
cout << rSum + rCnt * x << '\n';
delR[x] = 1;
cSum -= x;
cCnt--;
}
else {
if (delC[x]) {
cout << 0 << '\n';
continue;
}
cout << cSum + cCnt * x << '\n';
delC[x] = 1;
rSum -= x;
rCnt--;
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5544 // C++] 리그 (0) | 2022.06.05 |
---|---|
[BOJ 4353 // C++] Beavergnaw (0) | 2022.06.05 |
[BOJ 5547 // C++] 일루미네이션 (0) | 2022.06.05 |
[BOJ 4351 // C++] Hay Points (0) | 2022.06.05 |
[BOJ 5545 // C++] 최고의 피자 (0) | 2022.06.05 |