Problem D 풀이 (C++)

 문제 링크 : https://codeforces.com/contest/1520/problem/D

aj - ai = j - i 조건을 aj - j = ai - i로 바꿔 생각할 수 있다.

배열 a의 각 원소의 ai - i 값을 구하고 해당 값의 개수를 구하기 위해 map에 저장한다.

map에서 ai - i의 key 값에 해당하는 값을 올려주기 때문에 같은 원소의 개수를 알 수 있다.

원소의 개수가 x 개일 때, 원소의 쌍은 i < j 이어야 하기 때문에

쌍의 개수는 x(x - 1) / 2 개가 된다.

모든 값의 쌍의 개수를 구하여 더하면 답이 된다.

여기서 쌍의 개수를 구하는 과정을 이용해서 더 간단하게 알고리즘을 바꿔보면

원소의 개수가 x 개일 때 쌍의 개수는 1 + 2 + 3 + ~~ + (x - 2) + (x - 1) 이다.

그렇기 때문에 map에 저장한 후 계산하지 않고 각 원소를 입력받을 때마다 map의 ai - i의 개수를 더해주기 전에 기존의 ai - i의 개수를 더해주면 더 간단하게 바꿀 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <map>
 
using namespace std;
 
int main() {
 
    int t;
    cin >> t;
 
    while (t--) {
 
        int n;
        cin >> n;
 
        map<intint> m;
        long long ans = 0;
 
        for (int i = 1; i <= n; i++) {
            int a;
            cin >> a;
            ans += m[a - i];
            m[a - i]++;
        }
 
        cout << ans << endl;
    }
 
    return 0;
}
cs

댓글