Основное
 
 
Отправитель Задача Язык Вердикт Время Память Отослано Протест.  
71384909 Дорешивание:
Sugar_fan
1237G - 16 C++17 (GCC 7-32) Полное решение 155 мс 21596 КБ 2020-02-18 17:35:52 2020-02-18 17:35:52
→ Исходный код
#include<bits/stdc++.h>
using namespace std;
constexpr int maxn = 100000;
int a[maxn], p[maxn], n, k, avg;
map<int, vector<int>> mp;
void distribute(int l, int len, int need){
    if(len <= 1) return;
    if(a[l] == avg and need == 0){
        distribute((l + 1) % n, len - 1, 0);
        return;
    }
    int sum = 0, m = min(len, k);
    for(int i = 0; i < m; i += 1) sum += a[(l + i) % n];
    if(sum >= avg * (m - 1) + need){
        sum -= a[l] = avg + need;
        for(int i = 1; i < m - 1; i += 1) sum -= a[(l + i) % n] = avg;
        a[(l + m - 1) % n] = sum;
        cout << l;
        for(int i = 0; i < k; i += 1) cout << " " << a[(l + i) % n];
        cout << "\n";
        distribute((l + m - 1) % n, len - m + 1, 0);
        return;
    }
    distribute((l + m - 1) % n, len - m + 1, avg * (m - 1) + need - sum + a[(l + m - 1) % n]);
    sum = 0;
    for(int i = 0; i < m; i += 1) sum += a[(l + i) % n];
    for(int i = 1; i < m; i += 1) sum -= a[(l + i) % n] = avg;
    a[l] = sum;
    cout << l;
    for(int i = 0; i < k; i += 1) cout << " " << a[(l + i) % n];
    cout << "\n";
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin >> n >> k;
    for(int i = 0; i < n; i += 1){
        cin >> a[i];
        avg += a[i];
    }
    avg/= n;
    for(int i = 0; i < n; i += 1){
        p[i] = (i ? p[i - 1] + a[i] : a[0]) - avg;
        mp[p[i]].push_back(i);
    }
    int ans = 1;
    vector<int> cut(1);
    for(auto& p : mp){
        auto& v = p.second;
        int c = v.size();
        v.resize(c * 2);
        for(int i = 0; i < c; i += 1) v[i + c] = v[i] + n;
        map<int, int> pos;
        vector<int[20]> next(2 * c + 1);
        fill(*next.rbegin(), *next.rbegin() + 20, 2 * c);
        for(int i = 2 * c - 1; ~i; i -= 1){
            if(pos.count((v[i] + 1) % (k - 1)))
                next[i][0] = pos[(v[i] + 1) % (k - 1)];
            else next[i][0] = 2 * c;
            for(int j = 1; j < 20; j += 1) next[i][j] = next[next[i][j - 1]][j - 1];
            pos[v[i] % (k - 1)] = i;
        }
        int pans = 0, begin = 0; 
        for(int i = 0; i < c; i += 1){
            int p = i, ppans = 0;
            for(int j = 19; ~j; j -= 1) if(next[p][j] <= i + c){
                p = next[p][j];
                ppans += 1 << j;
            }
            if(p == i + c and ppans > pans){
                pans = ppans;
                begin = i;
            }
        }
        if(pans > ans){
            ans = pans;
            cut.clear();
            for(int i = begin; i < begin + c; i = next[i][0])
                cut.push_back(v[i]);
        }
    }
    int time = 0;
    vector<pair<int, int>> interval;
    for(int i = 0; i < (int)cut.size(); i += 1){
        int l = (cut[i] + 1) % n, r = (cut[(i + 1) % cut.size()] + 1) % n;
        if(r <= l) r += n;
        interval.push_back({l, r - l});
        time += (r - l + k - 3) / (k - 1);
    }
    cout << time << "\n";
    for(auto p : interval)
        distribute(p.first, p.second, 0);
    return 0;
}
?
Время: ? ms, память: ? КБ
Вердикт: ?
Ввод
?
Вывод участника
?
Ответ жюри
?
Комментарий чекера
?
Диагностика
?
Показать детали тестирования