蒟蒻求助
查看原帖
蒟蒻求助
237963
Tiagim楼主2022/9/16 17:19
#include<bits/stdc++.h>
using namespace std;
struct movem{int x,y;}mm[820005];
int n,m,r[55][405],kk,bl,h[55],book[55],cnt,num;
inline void move(int x,int y){
	mm[++kk].x=x,mm[kk].y=y,r[y][++h[y]]=r[x][h[x]--],r[x][h[x]+1]=0;
	while(mm[kk-1].y==mm[kk].x){
		mm[kk-1].y=mm[kk--].y;
		while(mm[kk].x==mm[kk].y)--kk;
	}
}
int main(){
	scanf("%d%d",&n,&m),bl=n+1;
	for(int i(1);i<=n;++i)for(int j(1);j<=m;++j)scanf("%d",&r[i][j]);
	for(int i(1);i<=n;++i)h[i]=m;
	for(int i(2);i<=n;++i){
		for(int j(1);j<=n+1;++j){
			if(j==bl)continue;
			cnt=0,num=1;
			for(int k(1);k<=m;++k)if(r[j][k]==i)++cnt;
			while(num==bl||num==j)++num;
			for(int k(1);k<=cnt;++k)move(num,bl);
			for(int k(1);k<=m;++k){
				if(r[j][h[j]]==i)move(j,num);
				else move(j,bl);
			}
			for(int k(1);k<=m-cnt;++k)move(bl,j);
			for(int k(1);k<=cnt;++k)move(num,j);
			for(int k(1);k<=cnt;++k)move(bl,num);
		}
		for(int j(1);j<=n+1;++j){
			if(j==bl)continue;
			while(r[j][h[j]]==i)move(j,bl);
		}
		book[bl]=1,num=1;
		while(book[num])++num;
		for(int j(1);j<=n+1;++j){
			if(j==num||j==bl)continue;
			while(h[j]<m)move(num,j);
		}
		bl=num;
	}
	printf("%d\n",kk);
	for(int i(1);i<=kk;++i)printf("%d %d\n",mm[i].x,mm[i].y);
	return 0;
}
2 20
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1

这个数据checker是ok,洛谷就WA了(B 1:half stacked rod),去掉move中的while有40pts,剩下WA(O2 RE)

求助QwQ

2022/9/16 17:19
加载中...