Pagini recente » Cod sursa (job #2301775) | Cod sursa (job #377924) | Cod sursa (job #2720557) | Cod sursa (job #500738) | Cod sursa (job #1829157)
#include <bits/stdc++.h>
using namespace std;
const int v_max = 2e2;
const int vmax = 2e2 + 10;
const int gmax = 75e3 + 10;
const int inf = 2e4 + 10;
int n, g;
int nr[vmax];
int dp[gmax][2], w_left[gmax][2];
vector < int > ans;
void input() {
scanf("%d %d", &n, &g);
for (int i = 1; i <= n; ++i) {
int x; scanf("%d", &x);
nr[x]++;
}
}
int get_dp(int p, int i, int val) {
int k = (i - p) / val;
return dp[i-k*val][(val&1)^1];
}
void update_ans(int i, int val, int p, int mid) {
int k = (i - p) / val;
if (dp[i-k*val][(val&1)^1] == inf) return;
dp[i][(val&1)] = dp[i-k*val][(val&1)^1] + k;
w_left[i][(val&1)] = (val <= mid) ? i : w_left[i-k*val][(val&1)^1];
}
void compute_dp(int left, int right, int g) {
int mid = (left + right) >> 1;
for (int i = 0; i <= g; ++i) dp[i][(left&1)^1] = inf;
dp[0][(left&1)^1] = 0;
for (int val = left; val <= right; ++val) { //gap = val
if (nr[val] == 0) {
for (int i = 0; i <= g; ++i)
dp[i][val&1] = dp[i][(val&1)^1],
w_left[i][val&1] = (val <= mid) ? i : w_left[i][(val&1)^1];
continue;
}
for (int i = 0; i <= g; ++i) dp[i][val&1] = inf;
for (int r = 0; r < val; ++r) {
deque < int > dq;
for (int i = r; i <= g; i += val) {
if ((int)dq.size() && (i - dq.front()) / val == nr[val] + 1)
dq.pop_front();
while ((int)dq.size() && dp[i][(val&1)^1] < get_dp(dq.back(), i, val))
dq.pop_back();
dq.push_back(i);
if ((int)dq.size())
update_ans(i, val, dq.front(), mid);
}
}
}
}
void compute_sol(int left, int right, int g_act) {
if (left == right) {
for (int i = 1; i <= g_act / left; ++i)
printf("%d\n", left);
return;
}
compute_dp(left, right, g_act);
int mid = (left + right) >> 1;
int w_act; for (w_act = g_act; dp[w_act][right&1] == inf; w_act--);
if (right - left == v_max - 1)
printf("%d %d\n", w_act, dp[w_act][right&1]);
int w_leftACT = w_left[w_act][right&1];
compute_sol(left, mid, w_leftACT);
compute_sol(mid + 1, right, w_act - w_leftACT);
}
int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
input();
compute_sol(1, v_max, g);
return 0;
}