Submission #1327496

#TimeUsernameProblemLanguageResultExecution timeMemory
1327496sh_qaxxorov_571Stone Arranging 2 (JOI23_ho_t1)C++20
100 / 100
205 ms13980 KiB
#include <iostream>
#include <vector>
#include <map>

using namespace std;

/**
 * JOI 2022/2023 Final Round - Task 1 (Go Stones)
 * Zaman Karmaşıklığı: O(N log N) veya O(N) (map yerine unordered_map kullanılırsa)
 */

struct Block {
    int color;
    int first_index;
};

int main() {
    // Giriş ve çıkış işlemlerini hızlandır
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    if (!(cin >> N)) return 0;

    // Yığın: {renk, bu renk bloğunun başladığı ilk taşın indeksi}
    vector<Block> stack;
    // last_pos: Bir rengin yığında bulunduğu en son konumu (index) tutar
    map<int, int> last_pos;

    for (int i = 1; i <= N; i++) {
        int color;
        cin >> color;

        // Eğer bu renk daha önce yığında varsa
        if (last_pos.count(color)) {
            int pos = last_pos[color];
            
            // Yığındaki bu pozisyondan sonraki tüm renkleri sil
            // Çünkü aradaki tüm taşlar artık bu 'color' rengine boyandı
            while ((int)stack.size() > pos + 1) {
                last_pos.erase(stack.back().color);
                stack.pop_back();
            }
            // Mevcut bloğun sonunu güncellemek gerekmez, 
            // çünkü aynı renk bloğu devam ediyor veya genişliyor.
        } else {
            // Renk yoksa yeni bir blok olarak ekle
            last_pos[color] = stack.size();
            stack.push_back({color, i});
        }
    }

    // Sonuçları yazdır
    // Her bloğun rengini, bir sonraki bloğun başlangıcına kadar olan taşlar için bas
    vector<int> final_colors(N + 1);
    for (int i = 0; i < (int)stack.size(); i++) {
        int end_idx = (i + 1 < (int)stack.size()) ? stack[i+1].first_index : N + 1;
        for (int j = stack[i].first_index; j < end_idx; j++) {
            final_colors[j] = stack[i].color;
        }
    }

    for (int i = 1; i <= N; i++) {
        cout << final_colors[i] << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...