MnZn求助35分搜索写挂,但手玩测试数据似乎无误/?
查看原帖
MnZn求助35分搜索写挂,但手玩测试数据似乎无误/?
215915
lOpzIth楼主2022/12/8 00:18

RTRT

#include <bits/stdc++.h>
#define int long long 
#define Arr std::vector
const int N = 305;
const int M = 2e6 + 5;
int T, n, m, k, a[M], st[N][2], t[2 * N], opt;// 0 -> bott  1 -> top
bool flag = false;
Arr<int> ST[4];
Arr<int> stk[N];
Arr<int> emt, type, ans1, ans2;
inline int read()
{
	int w = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9')
	{
		w = (w << 3) + (w << 1) + (ch - 48);
		ch = getchar();
	}
	return w * f;
}

void Init() 
{
	opt = 0;
	flag = false;
	emt.clear(), type.clear(), ans1.clear(), ans2.clear();
	for (int i = 1; i <= n + 3; i++) stk[i].clear(), ST[i].clear();
	for (int i = 1; i <= n + 3; i++)
	{
		st[i][0] = st[i][1] = 0;
	}
	for (int i = 1; i < n; i++) emt.push_back(i);
}

void Print()
{
	printf("%lld\n", opt);
	for (int i = 0; i < opt; i++)
	{
		int Type = type[i], Ans1 = ans1[i], Ans2 = ans2[i];
		if (Ans2 == -1)
		{
			printf("%lld %lld\n", Type, Ans1);
		}
		else
		{
			printf("%lld %lld %lld\n", Type, Ans1, Ans2); 
		}
	}
}

void dfs(int step)
{
	if (flag) return ;
	if (step == m + 1)
	{
		int Siz = 0;
		for (int i = 1; i <= m; i++) Siz += ST[i].size();
		if (Siz == 0 && !flag)
		{
			Print();
			flag = true;
			return ;
		}
		return ;
	}
	for (int i = 1; i <= n; i++)
	{
		if (flag) return ;
		int siz = ST[i].size();
		if (siz != 0)
		{
			int tmp = *ST[i].rbegin();
			if (tmp == a[step])
			{
				ST[i].pop_back();
				opt++;
				type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
				dfs(step + 1);
				ST[i].push_back(tmp);
				opt--;
				type.pop_back(); ans1.pop_back(); ans2.pop_back();
				if (flag) return ;
			}
			else
			{
				ST[i].push_back(a[step]);
				opt++;
				type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
				dfs(step + 1);
				ST[i].pop_back();
				opt--;
				type.pop_back(); ans1.pop_back(); ans2.pop_back();
				if (flag) return ;
			}
		}
		else
		{
			for (int j = 1; j <= n; j++)
			{
				if (i == j) continue;
				int Siz = ST[j].size();
				if (Siz == 0) continue;
				int bott = ST[j][0];
				if (bott == a[step])
				{
					ST[j].erase(ST[j].begin());
					opt += 2;
					type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
					type.push_back(2); ans1.push_back(i); ans2.push_back(j);
					dfs(step + 1);
					ST[j].insert(ST[j].begin(), bott);
					opt -= 2;
					type.pop_back(); type.pop_back(); ans1.pop_back(); ans1.pop_back(); ans2.pop_back(); ans2.pop_back();
					if (flag) return ;
				}
			}
			ST[i].push_back(a[step]);
			opt++;
			type.push_back(1); ans1.push_back(i); ans2.push_back(-1);
			dfs(step + 1);
			ST[i].pop_back();
			opt--;
			type.pop_back(); ans1.pop_back(); ans2.pop_back();
			if (flag) return ;
		}
	}
	if (flag) return ;
}

signed main()
{
	T = read(); int tt = T;
	while (T--)
	{
		n = read(), m = read(), k = read();
		for (int i = 1; i <= m; i++) a[i] = read();
		//Input
		if (tt == 1001)
		{
			int op = 0;
			Init();
			for (int i = 1; i <= m; i++)
			{
				if (t[a[i]])
				{
					int plc = t[a[i]];
					if (st[plc][0] == a[i])
					{
						op += 2;
						type.push_back(1); ans1.push_back(n); ans2.push_back(-1);
						type.push_back(2); ans1.push_back(plc); ans2.push_back(n);
						st[plc][0] = 0;
						if (st[plc][1])
						{
							st[plc][0] = st[plc][1];
							st[plc][1] = 0;
							emt.push_back(plc);
						}
					}
					else if (st[plc][1] == a[i])
					{
						op++;
						type.push_back(1); ans1.push_back(plc); ans2.push_back(-1);
						st[plc][1] = 0;
						emt.push_back(plc);
					}
					t[a[i]] = 0;
				}//the stack have node
				else
				{
					int stack = *emt.rbegin(); t[a[i]] = stack;
					op++; type.push_back(1); ans1.push_back(stack); ans2.push_back(-1);
					if (st[stack][0] == 0)
					{
						st[stack][0] = a[i];
					}
					else if (st[stack][1] == 0)
					{
						st[stack][1] = a[i];
						emt.pop_back();
					}
				}
			}
			printf("%lld\n", op);
			for (int i = 0; i < op; i++)
			{
				int Type = type[i], Ans1 = ans1[i], Ans2 = ans2[i];
				if (Ans2 == -1)
				{
					printf("%lld %lld\n", Type, Ans1);
				}
				else
				{
					printf("%lld %lld %lld\n", Type, Ans1, Ans2); 
				}
			}
		}
		if (tt == 3)
		{
			Init();
			dfs(1);
		}
	}
	return 0;
}
2022/12/8 00:18
加载中...