0pts求条
查看原帖
0pts求条
1024904
LFRED2023楼主2024/10/4 14:29
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
int T;
int n,m,k;
int q[2000010];
struct node{
	int num[6];
	int siz;
}s[310];
int pos[1010];//每种颜色所在的栈编号 
int sp = 0;
struct node1{
	int type;
	int x;
	int y;
}op[4000010];
int cnt = 0;
inline void solve(int col,int id)
{
	if(!sp)
	{
		sp = 1;
		while(s[sp].siz > 0) sp++;
		if(sp == n + 1) sp = 0;
	}
	if(pos[col])//存在 
	{
		int x = pos[col];
		if(s[x].num[s[x].siz] == col)//栈顶
		{
			s[x].siz--;
			if(s[x].siz == 0 && sp == 0) sp = x;
			pos[col] = 0;
			op[++cnt].type = 1;
			op[cnt].x = x;
			return;
		}
		if(s[x].num[1] == col && sp)
		{
			op[++cnt].type = 1;
			op[cnt].x = sp;//放到空栈 
			op[++cnt].type = 2;
			op[cnt].x = x;
			op[cnt].y = sp;//2操作消除
			for(int i = 1;i < s[x].siz;++i) s[x].num[i] = s[x].num[i + 1];
			s[x].siz--;
			return; 
 		}
	}
	else//不存在 
	{
		for(int i = 1;i <= n;++i)
		{
			if(i == sp) continue;
			if(s[i].siz <= 1)
			{
				s[i].num[++s[i].siz] = col;
				pos[col] = i;
				op[++cnt].type = 1;
				op[cnt].x = i;
				return;
			}
		}
		//放不了
		int t = id;
		while(s[pos[q[t]]].num[1] != q[t] && t < m) t++;
		int col1 = s[pos[q[t]]].num[s[pos[q[t]]].siz];
		int num = 0;
		for(int i = id;i <= t;++i)
		{
			if(q[i] == col1) num++;
			if(q[i] == col && i != id)
			{
				op[++cnt].type = 1;
				op[cnt].x = sp;
				pos[col] = sp;
				s[sp].num[1] = col;
				s[sp].siz++;
				sp = 0;
				return;
			}
		}
		if(num % 2 == 1)
		{
			op[++cnt].type = 1;
			op[cnt].x = sp;
			pos[col] = sp;
			s[sp].num[1] = col;
			s[sp].siz++;
			sp = 0;
			return;
		}
		else
		{
			op[++cnt].type = 1;
			op[cnt].x = pos[q[t]];
			pos[col] = pos[q[t]];
			s[pos[q[t]]].num[++s[pos[q[t]]].siz] = col;
			s[pos[q[t]]].siz++;
			return;
		}
	}
}

int main()
{
	cin >> T;
	while(T--)
	{
		cin >> n >> m >> k;
		for(int i = 1;i <= m;++i) cin >> q[i];
		for(int i = 1;i <= n;++i)
		{
			int siz = s[i].siz;
			for(int j = 1;j <= siz;++j) s[i].num[j] = 0;
			s[i].siz = 0;
		}
		memset(pos,0,sizeof(pos));
		sp = n;//空栈 
		cnt = 0;
		for(int i = 1;i <= m;++i) solve(q[i],i);
		cout << cnt << endl;
		for(int i = 1;i <= cnt;++i)
		{
			cout << op[i].type << " ";
			if(op[i].type == 1) cout << op[i].x << endl;
			else cout << op[i].x << " " << op[i].y << endl;
		}
	}
	return 0;
}

为什么连操作次数都是错的啊

可我手推的数据都没错啊

看的第一篇题解的思路

自己写的马蜂还行保证舒适

2024/10/4 14:29
加载中...