Блог пользователя master_flomaster

Автор master_flomaster, история, 3 года назад, По-русски

На самом деле я считаю, что сортировка подсчетом самая простая и самая нужная сортировка, которую нужно знать, например я находил решения довольно сложных для меня задач именно при помощи сортировки подсчетом, могу привести пример:

Задачу 1546C - AquaMoon и странная сортировка я например решил при помощи сортировки подсчетом, так как у неё были маленькие ограничения по числам на футболках (всего до 1e5), я решил создать два массива, где учитывал четные и нечетные индексы массива, а потом пробегался уже по отсортированному масиву и вычитал 1, если индекс стоит на четной позиции из массива с четными номерами (то есть even[a[i]] -= 1) и то же самое делала с нечетными индексами.

Итог:

#include <bits/stdc++.h>

#define ll long long
using namespace std;
inline string solve(vector<int> &odd, vector<int> &even, vector<int> a, int n){
    for (int i = 0; i < n; ++i) {
        if (even[a[i]] != 0){
            if (i % 2 == 0){
                even[a[i]]--;
            }
        }
        if (odd[a[i]] != 0){
            if (i % 2 != 0){
                odd[a[i]]--;
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        if (even[a[i]] != 0 || odd[a[i]] != 0){
            return "NO";
        }
    }
    return "YES";
}
signed main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for(int i = 0; i < n; i++) cin >> a[i];
        vector<int> odd(1e5 + 1, 0), even(1e5 + 1, 0);
        for (int i = 0; i < n; ++i) {
            if (i % 2 == 0){
                even[a[i]] += 1;
            }else{
                odd[a[i]] += 1;
            }
        }
        sort(a.begin(), a.end());
        cout << solve(odd, even, a, n) << "\n";
    }
    return 0;
}

Мне бы очень хотелось узнать какие алгоритмы вы считаете незаменимыми и чаще всего используете ;)

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится