Cod sursa(job #513512)

Utilizator freak93Adrian Budau freak93 Data 15 decembrie 2010 23:43:55
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>

using namespace std;

const char iname[] = "ghiozdan.in";
const char oname[] = "ghiozdan.out";
const int maxg = 75005;
const int maxv = 205;
const int inf = 1000000000;

ifstream f(iname);
ofstream g(oname);

int deque[maxg], v[maxv], aux[2][maxg], dp[2][maxg];

void solve(int x, int y, int G) {
	if (G == 0)
		return;
	if (x == y - 1) {
		for (int i = 1; i <= G / x; ++i)
			g << x << "\n";                                                                                                                                   
		return;
	}
	int mid = (x + y) / 2;
	for (int i = 1; i <= G; ++i)
		dp[0][i] = inf;
	dp[0][0] = 0;
	aux[0][0] = 0;
	int type = 0;
	for (int  i = x; i < y; ++i)
		if (v[i] > 0) {
			type = 1 - type;
			for (int j = 0; j < i; ++j) {
				int p = 1, q = 1;
				deque[1] = j;
				for (int k = j; k <= G; k += i) {                           
					while (p <= q && deque[p] < k - v[i] * i)
						++p;                                                 
					while (p <= q && dp[1 - type][deque[q]] >= dp[1 - type][k] - (k - deque[q]) / i)
						--q;                                                
					deque[++q] = k;
					dp[type][k] = dp[1 - type][deque[p]] + (k - deque[p]) / i;
					if (i < mid)
						aux[type][k] = k;
					else
						aux[type][k] = aux [1 - type][deque[p]];               
					}
			}
		}
		
   	int i, p, q;
	for (i = G; i >=0 && dp[type][i] == inf; --i);
	if (x == 1 && y == 201)
		g << i << " " <<dp[type][i] << "\n";
	p = aux[type][i];
	q = i - p;
	solve(x, mid, p);
	solve(mid, y, q);
}

int n, G, i, x;

int main() {
	f >> n >> G;

	for (i = 0; i < n; ++i)
		f >> x, ++v[x];

	solve(1, 201, G);
}