Submission #67786645


Source Code Expand

#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <numeric>
#include <bitset>
#include <cmath>
#include <limits>
#include <array>

static const int MOD = 998244353;
using ll = long long;
using uint = unsigned;
using ull = unsigned long long;
using namespace std;

template<class T> constexpr T INF = ::numeric_limits<T>::max() / 32 * 15 + 208;

void solve(){
    int n;
    cin >> n;
    vector<int> A(n);
    for (auto &&i : A) scanf("%d", &i);
    vector<pair<int, int>> rle;
    rle.emplace_back(A[0], 1);
    for (int i = 1; i < n; ++i) {
        if(A[i] == rle.back().first){
            rle.back().second++;
        }else {
            rle.emplace_back(A[i], 1);
        }
    }
    int m = rle.size();
    vector<int> L(m), R(m);
    for (int i = 0; i < m; ++i) {
        L[i] = i-1;
        R[i] = (i+1 < m ? i+1 : -1);
    }
    vector<int> ord(m);
    iota(ord.begin(), ord.end(), 0);
    sort(ord.begin(), ord.end(), [&](int i, int j) {
        return rle[i].first < rle[j].first;
    });
    ll ans = 0;
    for (auto &&x: ord) {
        if(rle[x].second == 0) continue;
        int lval = (L[x] >= 0 ? rle[L[x]].first : -1);
        int rval = (R[x] >= 0 ? rle[R[x]].first : -1);
        int lx = L[x], rx = R[x];
        int val = (lval == -1 ? rval : (rval == -1 ? lval : min(lval, rval)));
        if(val == -1) continue;
        while(rle[x].first < val){
            if(rle[x].second != 1){
                if(rle[x].second&1){
                    ans++;
                    rle[x].second++;
                }
                rle[x].second /= 2;
                rle[x].first++;
            }else {
                ans += val - rle[x].first;
                rle[x].first = val;
            }
        }
        if(lval == rval){
            int k = rle[R[x]].second + rle[x].second + rle[L[x]].second;
            rle[lx].second = k;
            R[lx] = R[rx];
            if(R[rx] >= 0) L[R[rx]] = lx;
            rle[x].second = 0; L[x] = R[x] = -1;
            rle[rx].second = 0; L[rx] = R[rx] = -1;
        }else if(val == lval){
            rle[lx].second += rle[x].second;
            rle[x].second = 0;
            R[lx] = R[x];
            if(R[x] >= 0) L[R[x]] = lx;
        }else if(val == rval) {
            rle[rx].second += rle[x].second;
            rle[x].second = 0;
            L[rx] = L[x];
            if(L[x] >= 0) R[L[x]] = rx;
        }
    }
    for (int i = 0; i < m; ++i) {
        while(rle[i].second > 1){
            if(rle[i].second & 1){
                ans++;
                rle[i].second++;
            }
            rle[i].second /= 2;
            rle[i].first++;
        }
    }
    cout << ans << "\n";
}

int main() {
    int t;
    cin >> t;
    while(t--) solve();
    return 0;
}

Submission Info

Submission Time
Task A - Merge and Increment
User firiexp
Language C++ 20 (gcc 12.2)
Score 700
Code Size 2904 Byte
Status AC
Exec Time 155 ms
Memory 8100 KiB

Compile Error

Main.cpp: In function ‘void solve()’:
Main.cpp:25:29: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   25 |     for (auto &&i : A) scanf("%d", &i);
      |                        ~~~~~^~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 700 / 700
Status
AC × 1
AC × 64
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 01_small_07.txt, 01_small_08.txt, 01_small_09.txt, 01_small_10.txt, 01_small_11.txt, 01_small_12.txt, 01_small_13.txt, 01_small_14.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 03_sorted_00.txt, 03_sorted_01.txt, 03_sorted_02.txt, 03_sorted_03.txt, 03_sorted_04.txt, 03_sorted_05.txt, 04_almost_sorted_00.txt, 04_almost_sorted_01.txt, 04_almost_sorted_02.txt, 04_almost_sorted_03.txt, 04_almost_sorted_04.txt, 04_almost_sorted_05.txt, 05_same_00.txt, 05_same_01.txt, 05_same_02.txt, 06_corner_00.txt, 06_corner_01.txt, 06_corner_02.txt, 07_hack_1_00.txt, 07_hack_1_01.txt, 07_hack_1_02.txt, 07_hack_1_03.txt, 07_hack_1_04.txt, 08_hack_2_00.txt, 08_hack_2_01.txt, 08_hack_2_02.txt, 08_hack_2_03.txt, 08_hack_2_04.txt, 09_hack_3_00.txt, 09_hack_3_01.txt, 09_hack_3_02.txt, 09_hack_3_03.txt, 09_hack_3_04.txt, 09_hack_3_05.txt, 09_hack_3_06.txt, 09_hack_3_07.txt, 09_hack_3_08.txt, 09_hack_3_09.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3568 KiB
01_small_00.txt AC 69 ms 3620 KiB
01_small_01.txt AC 69 ms 3684 KiB
01_small_02.txt AC 49 ms 3676 KiB
01_small_03.txt AC 155 ms 3676 KiB
01_small_04.txt AC 115 ms 3616 KiB
01_small_05.txt AC 93 ms 3700 KiB
01_small_06.txt AC 81 ms 3616 KiB
01_small_07.txt AC 57 ms 3684 KiB
01_small_08.txt AC 44 ms 3692 KiB
01_small_09.txt AC 137 ms 3868 KiB
01_small_10.txt AC 98 ms 3688 KiB
01_small_11.txt AC 78 ms 3656 KiB
01_small_12.txt AC 67 ms 3868 KiB
01_small_13.txt AC 45 ms 3684 KiB
01_small_14.txt AC 33 ms 3496 KiB
02_random_00.txt AC 40 ms 7368 KiB
02_random_01.txt AC 45 ms 8004 KiB
02_random_02.txt AC 38 ms 7340 KiB
02_random_03.txt AC 45 ms 7996 KiB
02_random_04.txt AC 44 ms 7756 KiB
02_random_05.txt AC 45 ms 8052 KiB
02_random_06.txt AC 27 ms 6000 KiB
02_random_07.txt AC 45 ms 7936 KiB
02_random_08.txt AC 27 ms 6136 KiB
02_random_09.txt AC 46 ms 7980 KiB
03_sorted_00.txt AC 24 ms 8004 KiB
03_sorted_01.txt AC 23 ms 8100 KiB
03_sorted_02.txt AC 23 ms 7984 KiB
03_sorted_03.txt AC 24 ms 7976 KiB
03_sorted_04.txt AC 23 ms 8000 KiB
03_sorted_05.txt AC 23 ms 8028 KiB
04_almost_sorted_00.txt AC 24 ms 7964 KiB
04_almost_sorted_01.txt AC 23 ms 7980 KiB
04_almost_sorted_02.txt AC 23 ms 7860 KiB
04_almost_sorted_03.txt AC 24 ms 8056 KiB
04_almost_sorted_04.txt AC 24 ms 8096 KiB
04_almost_sorted_05.txt AC 24 ms 8000 KiB
05_same_00.txt AC 11 ms 3860 KiB
05_same_01.txt AC 16 ms 3976 KiB
05_same_02.txt AC 15 ms 4052 KiB
06_corner_00.txt AC 18 ms 7984 KiB
06_corner_01.txt AC 38 ms 8012 KiB
06_corner_02.txt AC 24 ms 7996 KiB
07_hack_1_00.txt AC 15 ms 3956 KiB
07_hack_1_01.txt AC 15 ms 3956 KiB
07_hack_1_02.txt AC 15 ms 3856 KiB
07_hack_1_03.txt AC 15 ms 3920 KiB
07_hack_1_04.txt AC 15 ms 3924 KiB
08_hack_2_00.txt AC 23 ms 6960 KiB
08_hack_2_01.txt AC 22 ms 7040 KiB
08_hack_2_02.txt AC 23 ms 6960 KiB
08_hack_2_03.txt AC 23 ms 6940 KiB
08_hack_2_04.txt AC 22 ms 6972 KiB
09_hack_3_00.txt AC 10 ms 4052 KiB
09_hack_3_01.txt AC 10 ms 3856 KiB
09_hack_3_02.txt AC 22 ms 7496 KiB
09_hack_3_03.txt AC 21 ms 7484 KiB
09_hack_3_04.txt AC 28 ms 7860 KiB
09_hack_3_05.txt AC 28 ms 7860 KiB
09_hack_3_06.txt AC 32 ms 7984 KiB
09_hack_3_07.txt AC 31 ms 7992 KiB
09_hack_3_08.txt AC 36 ms 8100 KiB
09_hack_3_09.txt AC 37 ms 7868 KiB