Pagini recente » Cod sursa (job #224621) | Cod sursa (job #311296) | Cod sursa (job #2968442) | Cod sursa (job #1381548) | Cod sursa (job #2847866)
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;
const ll NMAX = 75001;
const ll VMAX = 1001;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 447;
const ll base = 31;
const ll nr_of_bits = 21;
int f[NMAX];
deque <pii> dq[NMAX];
int dp[NMAX][1025];
pii last[NMAX][1025];
int main() {
ifstream cin("ghiozdan.in");
ofstream cout("ghiozdan.out");
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, g, i;
cin >> n >> g;
for(i = 1; i <= n; i++) {
int x;
cin >> x;
f[x]++;
}
for(int i = 0; i < NMAX; i++){
for(int j = 1; j <= g; j++)
dp[i][j] = 1e9;
}
for(int i = 1; i < NMAX; i++) {
for(int j = 0; j <= g; j++)
dp[i][j] = dp[i - 1][j];
if(!f[i])
continue;
for(int j = 0; j < i; j++)
dq[j].clear();
int cate = f[i];
for(int j = 0; j <= g; j++) {
int rest = j % i;
while(dq[rest].size() && dq[rest].back().first >= dp[i - 1][j])
dq[rest].pop_back();
dq[rest].push_back({dp[i - 1][j], j});
while(dq[rest].size() && (j - dq[rest].front().second) > cate * i)
dq[rest].pop_front();
int cine = dq[rest].front().second;
int cat = dq[rest].front().first;
if(cat + (j - cine) / i < dp[i][j]) {
dp[i][j] = cat + (j - cine) / i;
last[i][j] = {i, (j - cine) / i};
}
}
}
for(; g >= 0; g--) {
if(dp[NMAX - 1][g] != 1e9)
break;
}
int ind = NMAX - 1;
cout << g << " " << dp[NMAX - 1][g] << "\n";
while(g > 0) {
pii x = last[ind][g];
ind--;
while(x.second--) {
cout << x.first << "\n";
g -= x.first;
}
}
return 0;
}