слив ашки респы 1 тур, ауф :D

Правка ru1, от noobls, 2026-03-20 18:53:32

include <bits/stdc++.h>

define s second

define f first

define int long long

define lb lower_bound

define pb push_back

define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

using namespace std; const int mod1 = 1e9 + 7; const int mod2 = 1e9 + 9; const int maxn = 2 * 1e5 + 5; const int inf = 1e18 + 7;

void solve_problem() { // <------------- WW :D

int n, m, l;
cin >> n >> m >> l;

int copn = n;

int a[n + 1] = {};

for (int i = 1; i <= n; i++) {
  cin >> a[i];
}

int maxsum = 0;
int minsum = 0;
int maxcnt = 0;
int mincnt = m;

if (m > copn) {
  m = copn + 1;
}

if (m > copn) {
  for (int i = 1; i <= n; i++) {
    int ras = a[i] - a[i - 1];
    if (ras % m == 0) {
      minsum += ras / m;
      maxsum += ras / m;
      if (maxsum == minsum) {
        mincnt--;
        m--;
      } else {
        if (maxcnt == 1) {
          maxsum = minsum;
          maxcnt--;
          m--;
        } else {
          maxcnt--;
          m--;
        }
      }
    } else {
      if (minsum == maxsum) {
        minsum += ras / m;
        maxsum += ras / m + 1;
      } else {
        minsum += ras / m;
        maxsum += ras / m;
      }
      if (mincnt <= ras % m) {
        int ostatok = ras % m - mincnt;
        minsum++;
        mincnt = m;
        maxcnt = 0;
        if (ostatok > 0) {
          maxsum++;
          maxcnt += ostatok;
          mincnt -= ostatok;
        }
      } else {
        mincnt -= ras % m;
        maxcnt += ras % m;
      }
      if (maxcnt == 1) {
        maxsum = minsum;
        maxcnt--;
        m--;
      } else {
        if (maxcnt == 0) {
          mincnt--;
          m--;
        } else {
          maxcnt--;
          m--;
        }
      }
    }
  }
  cout << minsum + l - a[n] << "\n";
  return;
} else {
  int i = 1;
  int save = 0;
  int minok = false;
  int maxok = false;
  queue<int> q;
  int count_nummax = 0;
  int count_nummin = 0;
  while (i <= n && copn >= m) {
    int ras = a[i] - a[i - 1];
    if (ras < save) {
      q.push(ras);
      while (!q.empty()) {
        save = q.front();
        q.pop();
        i++;
        while (ras + a[i] - a[i - 1] < save) {
          ras += a[i] - a[i - 1];
          i++;
          copn--;
          if (maxcnt == 1) {
            maxcnt--;
            maxsum = minsum;
            count_nummax++;
          } else {
            if (maxcnt == 0) {
              mincnt--;
              count_nummin++;
            } else {
              maxcnt--;
              count_nummax++;
            }
          }
          q.push(maxsum);
        }

        ras = (a[i] - a[i - 1]) - (save - ras);
        if (maxcnt == 1) {
          maxcnt--;
          maxsum = minsum;
        } else {
          if (maxcnt == 0) {
            mincnt--;
            count_nummin++;
          } else {
            maxcnt--;
            count_nummax++;
          }
        }
        mincnt += count_nummin;
        if (maxcnt == 0 && maxcnt + count_nummax == 1) {
          maxsum++;
        }
        maxcnt += count_nummax;
        q.push(maxsum);
      }
    } else {
      ras -= save;
      if (minok) {
        mincnt++;
        minok = false;
      }
      if (maxok) {
        maxok = false;
        maxcnt++;
        if (maxcnt == 1) {
          maxsum++;
        }
      }
    }
    if (ras % m == 0) {
      minsum += ras / m;
      maxsum += ras / m;
      copn--;
      save = maxsum;
      if (maxsum == minsum) {
        mincnt--;
        minok = true;
      } else {
        if (maxcnt == 1) {
          maxcnt--;
          maxsum = minsum;
          maxok = true;
        } else {
          if (maxcnt == 0) {
            minok = true;
            mincnt--;
          } else {
            maxcnt--;
            maxok = true;
          }
        }
      }
    } else {
      if (minsum == maxsum) {
        minsum += ras / m;
        maxsum += ras / m + 1;
      } else {
        minsum += ras / m;
        maxsum += ras / m;
      }
      if (mincnt <= ras % m) {
        int ostatok = ras % m - mincnt;
        minsum++;
        mincnt = m;
        maxcnt = 0;
        if (ostatok > 0) {
          maxsum++;
          maxcnt += ostatok;
          mincnt -= ostatok;
        }
      } else {
        mincnt -= ras % m;
        maxcnt += ras % m;
      }
      copn--;
      if (maxcnt == 1) {
        maxsum = minsum;
        maxcnt--;
        maxok = true;
      } else {
        if (maxcnt == 0) {
          mincnt--;
          minok = true;
        } else {
          maxcnt--;
          maxok = true;
        }
      }
    }
  }
}

}

signed main () { //до апреля 1200 плиз IOS

int tt = 1;
cin >> tt;

while (tt--) {
  solve_problem();
}

}

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru1 Русский noobls 2026-03-20 18:53:32 5802 Первая редакция (опубликовано)