CF237B Young Table 题解
CF237B Young Table 题解
题目描述
题目解法
题目中要求满足以下条件:
对所有的 \(i,j (1< i\leq n,1\leq j\leq c_i)\),满足 \(a_{i,j}>a_{i-1,j}\)
对所有的 \(i,j (1\leq i\leq n,1 < j\leq c_i)\),满足 \(a_{i,j}>a_{i,j-1}\)
不难发现,对于样例:
4 3 5
6 1
2
将该表格进行排序后是满足条件的,如下:
1 2 3
4 5
6
又因为题目中给的是一个全排列,可以先记录好数字的位置然后再交换位置即可。
细节就看代码吧。
Code
#include<bits/stdc++.h>
using namespace std;
#define maxn 52
int len[maxn];
int mp[maxn][maxn];
void upd(int &x, int &y) // 表格中向后移动一步
{
if(y==len[x]) y=1, x++;
else y++;
}
pair<int, int> pos[maxn*maxn]; // 记录坐标
struct ans{int a, b, c, d;};
vector<ans> vc; // 记录答案
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>len[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=len[i];j++)
cin>>mp[i][j], pos[mp[i][j]]={i, j};
int sum=accumulate(len+1, len+1+n, 0); // 求出数字个数
int x=0, y=0;
for(int i=1;i<sum;i++)
{
upd(x, y); // 移动一步
if(mp[x][y]==i) continue; // 特判
vc.push_back({x,y,pos[i].first,pos[i].second});
int l=mp[x][y];
swap(mp[x][y], mp[pos[i].first][pos[i].second]);
swap(pos[l], pos[i]);
}
cout<<vc.size()<<'\n';
for(auto [a, b, c, d]:vc) cout<<a<<' '<<b<<' '<<c<<' '<<d<<'\n'; // 输出答案
}

浙公网安备 33010602011771号