Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Maria Pandele - 90p
- #include <fstream>
- #include <iostream>
- #include <vector>
- #include <cassert>
- #include <algorithm>
- const int N = 1e5;
- const int K = 1e2;
- const int VALMAX = 1e5;
- const int SMAX = 1e9;
- struct Fiu {
- int ind;
- int s;
- int st; int dr;
- };
- bool solve(int s_mezin, std::vector<int>& a, int& k) {
- int cnt = 0, s = 0;
- for (int i = 0; i < a.size(); ++i) {
- s += a[i];
- if (s >= s_mezin) {
- ++cnt;
- if (cnt == k) {
- break;
- }
- s = 0;
- }
- }
- if (cnt == k) {
- return true;
- }
- return false;
- }
- void imparte(const int& s_mezin, std::vector<int>& a, const int& k, std::vector<Fiu>& sol) {
- int cnt = -1, last = -1, s = 0;
- for (int i = 0; i < a.size(); ++i) {
- s += a[i];
- if (s >= s_mezin) {
- ++cnt;
- sol[cnt].st = last + 2;
- sol[cnt].dr = i + 1;
- sol[cnt].s = s;
- if (cnt == k - 1) {
- sol[cnt].dr = a.size();
- for (int j = i + 1; j < a.size(); ++j) {
- s += a[j];
- }
- sol[cnt].s = s;
- break;
- }
- last = i;
- s = 0;
- }
- }
- sort(sol.begin(), sol.end(), [](const Fiu& A, const Fiu& B) -> bool {
- return A.s > B.s;
- });
- for (int i = 0; i < sol.size(); ++i) {
- sol[i].ind = i + 1;
- }
- sort(sol.begin(), sol.end(), [](const Fiu& A, const Fiu& B) -> bool {
- return A.st < B.st;
- });
- }
- int main() {
- std::ifstream cin("mostenire.in");
- std::ofstream cout("mostenire.out");
- int n, k;
- cin >> n >> k;
- assert(k <= n && n <= N);
- assert(2 <= k && k <= K);
- std::vector<int> a(n);
- long long stotal = 0;
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- assert(1 <= a[i] && a[i] <= VALMAX);
- stotal += a[i];
- }
- assert(stotal <= SMAX);
- int mezin = 0;
- for (int step = (1 << 30); step; step >>= 1) {
- if (mezin + step <= stotal&& solve(mezin + step, a, k)) {
- mezin += step;
- }
- }
- assert(mezin != 0);
- std::vector<Fiu> sol(k);
- imparte(mezin, a, k, sol);
- cout << mezin << "\n";
- for (int i = 0; i < sol.size(); ++i) {
- cout << sol[i].ind << " " << sol[i].dr - sol[i].st + 1 << "\n";
- assert(sol[i].dr - sol[i].st + 1 > 0);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement