Competition/codeforces

Codeforces Round #550 (Div. 3) D. Equalize Them All

shyram 2019. 4. 1. 18:52

D. Equalize Them All

https://codeforces.com/contest/1144/problem/D


주어진 두 연산을 자세히 보면, i번째 수는 j번째 수와 같아지게 된다는 것을 알 수 있다.

이때, 연산 횟수를 최소화 하려면, 가장 많이 있는 수를 기준으로 연산을 수행하면 된다.

가장 많이 입력된 수를 찾고, 그 index를 중심으로 왼쪽, 오른쪽으로 연산을 진행하자.

루프 돌 때, 기준이 되는 수가 나왔다면 가볍게 넘어가준다.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
 
int n;
int arr[200001];
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> n;
    map<intint> mp;
    int mx = 0, mxidx = -1;
    
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        mp[arr[i]]++;
        if (mp[arr[i]] > mx) {
            mx = mp[arr[i]];
            mxidx = i;
        }
    }
 
    vector<pair<intpair<intint>>> vc;
    int ans = 0;
    for (int i = mxidx + 1; i < n; i++) {
        if (arr[i] != arr[i - 1]) {
            if(arr[i] > arr[i - 1])
                vc.push_back({2, { i + 1, i} });
            else
                vc.push_back({1, { i + 1, i} });
 
            arr[i] = arr[mxidx];
            ++ans;
        } 
    }
    for (int i = mxidx - 1; i >= 0; i--) {
        if (arr[i] != arr[i + 1]) {
            if (arr[i] > arr[i + 1])
                vc.push_back({ 2, { i + 1, i + 2} });
            else
                vc.push_back({ 1, { i + 1, i + 2} });
            arr[i] = arr[mxidx];
            ++ans;
        }
    }
 
    cout << ans << '\n';
 
    for (int i = 0; i < vc.size(); i++) {
        cout << vc[i].first << ' ' << vc[i].second.first << ' ' << vc[i].second.second << '\n';
    }
 
    return 0;
}
cs