Submission #922027

#TimeUsernameProblemLanguageResultExecution timeMemory
922027denniskimCookies (JOI23_cookies)C++17
100 / 100
235 ms249076 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef __int128 lll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pld;
#define MAX 9223372036854775807LL
#define MIN -9223372036854775807LL
#define INF 0x3f3f3f3f3f3f3f3f
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10);
#define sp << " "
#define en << "\n"
#define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end())

ll n;
ll a[15010];
ll m;
ll b[15010];
ll sum, S[15010];
priority_queue<ll> pq;
ll now, gaet;
vector< bitset<15010> > dp[15010];
bitset<15010> tmp;
ll ans = INF;
ll I, J, K;
vector<ll> box;
priority_queue<pll> pq2;
vector<ll> ans2[15010];

int main(void)
{
	fastio
	
	cin >> n;
	
	for(ll i = 1 ; i <= n ; i++)
	{
		cin >> a[i];
		
		sum += a[i];
		pq.push(a[i]);
	}
	
	cin >> m;
	
	for(ll i = 1 ; i <= m ; i++)
		cin >> b[i];
	
	now = sum, gaet = 0;
	
	for(ll i = sum ; i >= 1 ; i--)
	{
		while(!pq.empty() && pq.top() >= i)
		{
			now -= pq.top();
			gaet++;
			pq.pop();
		}
		
		S[i] = now + gaet * i;
	}
	
	for(ll i = 0 ; i <= sum ; i++)
	{
		dp[i].push_back(tmp);
		
		for(ll j = 1 ; j <= m ; j++)
		{
			if(b[j] * i <= sum)
				dp[i].push_back(tmp);
			else
				break;
		}
	}
	
	dp[0].push_back(tmp);
	
	for(ll j = 0 ; j < (ll)dp[0].size() ; j++)
		dp[0][j].set(0, 1);
	
	for(ll i = 1 ; i <= sum ; i++)
	{
		for(ll j = S[i - 1] + 1 ; j <= S[i] ; j++)
			tmp.set(j, 1);
		
		ll siz = (ll)dp[i].size() - 1;
		ll siz2 = (ll)dp[i - 1].size() - 1;
		
		for(ll j = siz ; j >= 1 ; j--)
		{
			if(j < siz)
				dp[i][j] |= dp[i][j + 1];
			
			if(j <= siz2)
				dp[i][j] |= (dp[i - 1][j] << b[j]);
			
			dp[i][j] &= tmp;
		}
	}
	
	for(ll i = 0 ; i <= sum ; i++)
	{
		ll siz = (ll)dp[i].size() - 1;
		
		for(ll j = 1 ; j <= siz ; j++)
		{
			if(dp[i][j][sum])
			{
				if(ans > i)
				{
					ans = i;
					I = i, J = j, K = sum;
				}
			}
		}
	}
	
	if(ans == INF)
	{
		cout << -1;
		return 0;
	}
	
	cout << ans en;
	
	while(1)
	{
		if(I == 0)
			break;
		
		if(J < (ll)dp[I].size() - 1 && dp[I][J + 1][K])
		{
			J = J + 1;
			continue;
		}
		
		box.push_back(b[J]);
		I = I - 1, K = K - b[J];
	}
	
	ll num = 1;
	
	for(auto &i : box)
		pq2.push({i, num++});
	
	for(ll i = 1 ; i <= n ; i++)
	{
		vector<pll> tmp3;
		
		for(ll j = 0 ; j < a[i] ; j++)
		{
			tmp3.push_back(pq2.top());
			pq2.pop();
		}
		
		for(auto &j : tmp3)
		{
			ans2[j.se].push_back(i);
			
			if(j.fi > 1)
				pq2.push({j.fi - 1, j.se});
		}
	}
	
	for(ll i = 1 ; i <= ans ; i++)
	{
		cout << (ll)ans2[i].size() sp;
		
		for(auto &j : ans2[i])
			cout << j sp;
		
		cout en;
	}
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...