当前位置: 首页 > news >正文

题解:P11357 [eJOI 2023] Square Grid Puzzle

好题没人写

题意

给定一个 \(N\times N\) 的矩阵,里面有 \(0\)\(N\times N-1\) 的数,有两种操作,分别是将第一行重排然后放到最后一行,和把第一列重排放到最后一列。构造一种操作方案,使得操作完后矩阵有序。要求操作次数 \(<3N\)

思路

先将每个数替换为它最终的位置的二元组 \((x,y)\),表示这个数最终在 \(x\)\(y\) 列。然后观察操作次数,发现是 \(3N\),想到整体操作 \(3\) 次。然后可以发现,做 \(N\)D 操作相当于把每行重排,做 \(N\)R 操作相当于每列重排,考虑用 \(3\) 次这样的操作排序整个矩阵。

考虑逆向操作,假设最后一次将每行重排了得到有序矩阵,那么要求操作之前所有列已经有序。再往前一次操作一定是将每列重排,要求每列没有重复的 \(x\)。那么我们的问题转化为将每行重排,使得每列的 \(x\) 不重复。

考虑建图表示这个限制。建二分图,左部点为矩阵内点的坐标,右部点为每行的每个值,每个左部点向所在行的值连边。首先显然存在完美匹配,于是用 Hall 定理,有每个点集的邻域大小大于等于点集大小,整行的限制最严。逐列构造,从中任意取出一列的完美匹配,那么每行的点数和邻域大小都减一,仍然满足 Hall 定理,于是递归构造方案即可。

但是现在我们的操作次数是 \(3N\),发现前 \(N\) 次操作中可以省掉最后一次,将最后一行换到第一行然后从第二行开始操作,求匹配的时候钦定第一行的点对应的值即可。由于 \(N\le9\),求匹配时直接枚举排列就能通过。

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N=10,inf=0x3f3f3f3f;
int n;
pair<int,int>a[N][N],res[N];
int tmp[N],last[N];
int c[N][N],b[N][N];
struct Data{char t;vector<int>res;};
vector<Data>ans;
int calc(pair<int,int>x){return x.first*n+x.second;}
signed main(){clock_t _st=clock();ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){int x;cin>>x;a[i][j]={x/n,x%n};}}for(int i=n-1;i;i--)swap(a[i],a[i-1]);ans.resize(3*n);for(int i=1;i<n;i++)ans[i].res.resize(n),ans[i].t='D';for(int i=0;i<n;i++)for(int j=0;j<n;j++)b[i][a[i][j].first]++;for(int j=0;j<n;j++){for(int i=0;i<n;i++)tmp[i]=i;do{bool fl=tmp[0]==a[0][j].first;for(int i=0;fl&&i<n;i++)if(!b[i][tmp[i]]){fl=0;break;}if(fl)break;}while(next_permutation(tmp,tmp+n));for(int i=0;i<n;i++)b[i][c[i][j]=tmp[i]]--;}for(int i=1;i<n;i++){for(int j=0;j<n;j++)last[j]=0;for(int j=0;j<n;j++){for(int k=last[c[i][j]];k<n;k++)if(a[i][k].first==c[i][j]){last[c[i][j]]=k+1,ans[i].res[j]=calc(a[i][k]);break;}}for(int j=0;j<n;j++)a[i][j]={ans[i].res[j]/n,ans[i].res[j]%n};}for(int j=0;j<n;j++){for(int i=0;i<n;i++)tmp[i]=i;stable_sort(tmp,tmp+n,[=](int x,int y){return a[x][j].first<a[y][j].first;});ans[j+n].t='R',ans[j+n].res.resize(n);for(int i=0;i<n;i++)res[i]=a[tmp[i]][j];for(int i=0;i<n;i++)ans[j+n].res[i]=calc(a[i][j]=res[i]);}for(int i=0;i<n;i++){for(int j=0;j<n;j++)tmp[j]=j;for(int j=0;j<n;j++)c[a[i][j].first][j]--;stable_sort(tmp,tmp+n,[=](int x,int y){return a[i][x].second<a[i][y].second;});ans[i+n*2].t='D',ans[i+n*2].res.resize(n);for(int j=0;j<n;j++)res[j]=a[i][tmp[j]];for(int j=0;j<n;j++)c[a[i][j].first][j]++;for(int j=0;j<n;j++)ans[i+n*2].res[j]=calc(a[i][j]=res[j]);}cout<<ans.size()-1<<'\n';for(int i=1;i<n*3;i++){cout<<ans[i].t<<' ';for(int x:ans[i].res)cout<<x<<' ';cout<<'\n';}clock_t _ed=clock();cerr<<(_ed-_st)*1.0/CLOCKS_PER_SEC<<'\n';return 0;
}
http://www.jsqmd.com/news/436486/

相关文章:

  • 56456
  • 什么是 Tokens?大模型 Tokens 计数规则一文讲透
  • milvus数据库简介和连接操作
  • 2026年质量好的SQ无极绳绞车 品牌推荐:无极绳绞车梭车/无极绳绞车轮组/盘闸双速多用绞车长期合作厂家推荐 - 行业平台推荐
  • 基于multisim的四人数字式抢答器电路设计
  • Vercel推Agent Browser:让AI自己控制浏览器,比Playwright省93%上下文
  • 传统监控只喊「出事了」,这款AI运维工具直接甩你「根因+方案」|catpaw 实战全解
  • 从单点工具到智能流水线:企业级多智能体AI创建工作流架构实战
  • 什么是氛围编码?
  • 2026运维转型必看:OpenClaw让故障自愈率达90%,MTTR压缩至30分钟
  • 2026年热门的石墨挤塑板 厂家推荐:国标挤塑板/阻燃挤塑板可靠供应商推荐 - 行业平台推荐
  • 2026年热门的板材珍珠棉发泡机 公司推荐:全自动珍珠棉发泡机/水果网珍珠棉发泡机可靠供应商推荐 - 行业平台推荐
  • 研究 RTPEngine publish
  • ”氛围编码”在网络安全上会引入什么问题吗?
  • Java全栈开发面试实录:从基础到高阶的深度技术探讨
  • 构建AI Agent的知识更新机制:保持信息时效性
  • 电商全平台 API 接口|淘宝京东 1688 速卖通亚马逊数据采集
  • 突破传统多模态整合局限!MIT提出APOLLO框架,实现细胞共享与特异性信息明确分离
  • 2026年杭州品牌策划咨询公司推荐:家电品牌策划、大健康品牌策划、新消费品牌策划、食品品牌策划、B2B品牌策划、城市文旅品牌策划、电动车品牌策划、全品类品牌战略营销咨询服务优选 - 海棠依旧大
  • 2026年口碑好的冷库制冷压缩机 公司推荐:工业制冷压缩机/活塞式制冷压缩机口碑好的厂家推荐 - 行业平台推荐
  • Vue项目目录结构全解析
  • 车衣改色新潮流,2026这些门店引领风尚,汽车车衣/贴太阳膜/隐形车衣/太阳膜/贴车衣/车衣改色,车衣改色定制附近推荐 - 品牌推荐师
  • 2026Q1无锡十大财税机构推荐榜单(本土标杆与特色机构全盘点)工商注册+代理记账靠谱口碑推荐 - 品牌智鉴榜
  • 2026年比较好的特种纸 品牌推荐:特种纸印刷/特种纸印刷包装值得信赖的生产厂家 - 行业平台推荐
  • 基于proteus的LM331的频率电压变换电路
  • 2026年比较好的栏杆 工厂推荐:锌钢楼梯栏杆稳定供应商推荐 - 行业平台推荐
  • 2026年知名的泡棉 公司推荐:PE泡棉/EVA泡棉实力工厂怎么选 - 行业平台推荐
  • 2026沈北,给你推荐附近口碑好的汽车贴膜门店!改色膜/隐形车衣/玻璃膜/沈北车衣/汽车贴膜,汽车贴膜团队联系方式 - 品牌推荐师
  • AF 430 ConA,Alexa Fluor 430 ConA的四聚体结构:Ca²⁺/Mn²⁺依赖性糖结合活性研究
  • S195柴油机机体钻组合机床总体及夹具设计