#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;
}
为什么连操作次数都是错的啊
可我手推的数据都没错啊
看的第一篇题解的思路
自己写的马蜂还行保证舒适