Submission #1258904

#TimeUsernameProblemLanguageResultExecution timeMemory
1258904arashmemarJOIRIS (JOI16_joiris)C++20
0 / 100
1095 ms320 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 100;

bool a[2 * maxn][maxn];
int r[maxn];
int mx;

vector <pair <int, int>> ops;

int n, k;

void sh(int ind)
{
	for (int j = 1;j <= n;j++)
	{
		r[j] = 0;
	}
	mx = 0;
	for (int i = ind;i < maxn - 1;i++)
	{
		for (int j = 1;j <= n;j++)
		{
			a[i][j] = a[i + 1][j];
			mx = max(mx, r[j]);
		}
	}
	for (int i = 1;i < maxn;i++)
	{
		for (int j = 1;j <= n;j++)
		{
			if (a[i][j])
			{
				r[j] = i;
			}
		}
	}
	return ;
}

int fh(int x)
{
	int ind = 0;
	for (int i = maxn - 1;i;i--)
	{
		if (a[i][x])
		{
			ind = i;
			break;
		}
	}
	return ind;
}

bool check()
{
	bool ret = 0;
	for (int i = 1;i < maxn;i++)
	{
		bool d = 1;
		for (int j = 1;j <= n;j++)
		{
			d &= a[i][j];
		}
		if (d)
		{
			sh(i);
			check();
			ret = 1;
		}
	}
	return ret;
}

bool add(int t, int x)
{
	ops.push_back({t, x});
	if (t == 1)
	{
		int ind = fh(x) + 1;
		for (int i = ind;i < ind + k;i++)
		{
			a[i][x] = 1;
		}
		r[x] += k;
		mx = max(r[x], mx);
	}
	else
	{
		int ind = 0;
		for (int i = x;i < x + k;i++)
		{
			ind = max(ind, fh(i));
		}
		for (int i = x;i < x + k;i++)
		{
			a[ind + 1][i] = 1;
			r[i] = ind + 1;
		}
		mx = max(mx, ind + 1);
	}

	bool ret = check();
	return ret;
}

void s(bool x = 0)
{
	while (mx >= k)
	{
		for (int i = 1;i <= n;i++)
		{
			if (r[i] == 0 or (r[i] < k and x))
			{
				if (add(1, i))
				{
					break;
				}
			}
		}
	}
	return ;
}

void solve()
{
	if (mx == 0)
	{
		return ;
	}
	s();
	for (int i = 2;i < n;i++)
	{
		if (r[i] != r[i - 1])
		{
			add(2, i);
			s(1);
		}
	}

	if (mx == 0)
	{
		cout << ops.size() << endl;
		for (auto o : ops)
		{
			cout << o.first << ' ' << o.second << endl;
		}
		return ;
	}


	if (mx == 1 and n % 2 == 0)
	{
		cout << -1;
		return ;
	}

	if (r[n] == 0)
	{
		add(1, n);
	}
	for (int i = 1;i <= n / 2;i++)
	{
		add(2, i * 2 - 1);
	}
	cout << ops.size() << endl;
	for (auto o : ops)
	{
		cout << o.first << ' ' << o.second << endl;
	}
	return ;
}


int main()
{
	cin >> n >> k;
	for (int i = 1;i <= n;i++)
	{
		int inp;
		cin >> inp;
		for (int j = 1;j <= inp;j++)
		{
			a[j][i] = 1;
		}
		r[i] = inp;
		mx = max(mx, inp);
	}
	solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...