Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("03")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include <iostream>
- #include <iomanip>
- #include <cstdlib>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- #include <unordered_map>
- #include <unordered_set>
- #include <queue>
- #include <deque>
- #include <cmath>
- #include <numeric>
- #include <algorithm>
- #include <ctime>
- #include <chrono>
- #include <random>
- #include <functional>
- #include <stack>
- //#include <windows.h>
- //void* operator new(size_t size) {
- // if (void* ptr = HeapAlloc(GetProcessHeap(), 0, size ? size : 1)) return ptr;
- // throw std::bad_alloc{};
- //}
- //void operator delete(void* ptr) {
- // HeapFree(GetProcessHeap(), 0, ptr);
- //}
- using namespace std;
- using ll = long long;
- using db = double;
- using ldb = long double;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using vint = vector<int>;
- using vll = vector<ll>;
- using vst = vector<string>;
- #define all(x) x.begin(), x.end()
- #define size(x) int(x.size())
- #define rep(x) for(int rep_i = 0; rep_i < x; ++rep_i)
- #define forp(i, s, f) for(int i = s; i < f; ++i)
- #define form(i, s, f) for(int i = s; i > f; --i)
- #define PB push_back
- #define MP make_pair
- #define F first
- #define S second
- #define elif else if
- #define dprint(x) for (auto now: x) cout << now << " "
- const int MOD = 1e9 + 7;
- const int MOD2 = 998244353;
- const int INF = 2e9 + 7;
- const ll LINF = 1e18 + 7;
- const double EPS = 1e-9;
- const long double PI = acosl(-1.0);
- void solve() {
- ll n, k;
- cin >> n >> k;
- vll sp;
- rep(n) {
- ll x;
- cin >> x;
- sp.push_back(x);
- }
- vll dp(n), dp2(n);
- ll sm = 0;
- multiset <ll> mst;
- ll tdl = 0;
- forp(i, 0, k) {
- sm += sp[i];
- mst.insert(sp[i]);
- }
- dp[k - 1] = sm * *(mst.begin());
- dp2[k - 1] = k;
- ll i = k;
- while (i < n) {
- ll td = sp[tdl];
- sm -= td;
- sm += sp[i];
- mst.erase(mst.find(td));
- mst.insert(sp[i]);
- ll msm = *(mst.begin()) * (sm);
- if (dp[i - 1] >= dp[i - k] + msm) {
- dp[i] = dp[i - 1];
- dp2[i] = dp2[i - 1];
- }
- else {
- dp[i] = dp[i - k] + msm;
- dp2[i] = i + 1;
- }
- tdl++;
- i++;
- }
- ll p = n - 1;
- vll ans;
- while (p > -1 and dp2[p] > 0) {
- if (p == 0) {
- ans.push_back(dp2[0]);
- break;
- }
- ans.push_back(dp2[p] - k + 1);
- p = dp2[p] - k - 1;
- }
- cout << size(ans) << "\n";
- reverse(all(ans));
- dprint(ans);
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- /*cout << setprecision(x)*/
- cout << fixed;
- int t;
- t = 1;
- while (t > 0) {
- solve();
- t--;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment