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

【题解】Luogu P2354 [NOI2014] 随机数生成器

题意

题面花里胡哨。直接看到棋盘那一段,告诉我们 \(K=N\times M\),也就是按给定递推式算出前 \(N\times M\) 项,按规定交换 \(1\sim K\) 的递增序列,最后再按顺序填入 \(N \times M\) 的数表。在上面找排序后字典序最小的路径序列。

思路

前半部分直接模拟。

重点在于寻找最优路径。排序后字典序最小,意味着路径中每一个数都要尽可能小。考虑贪心,在整个数表中找还未选过且能构成路径的最小的数。能构成路径的数,即该数一定在所有已选数的左上或右下。易得同时满足条件的数一定不超过 \(N+M-1\) 个。因为起点在所有数的左上,终点在所有数的右下,在这条法则下,起终点一定能被选到。

预处理出每个数在数表中的位置,从小到大遍历。用 \(L\)\(R\) 数组记录每一行还能选的数的区间。如果该数在区间内,则直接输出,并更新每一行的区间。直到选择了 \(N-M+1\) 个数后退出。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=2.5e7+10;
long long a,b,c,d;
int n,m,q,tot;
int t[maxn],x[maxn];
int l[5010],r[5010];
int main(){scanf("%lld%lld%lld%lld%lld",&x[0],&a,&b,&c,&d);scanf("%d%d%d",&n,&m,&q);//模拟 for(int i=1;i<=n*m;i++){t[i]=i;x[i]=(a*x[i-1]*x[i-1]%d+b*x[i-1]%d+c)%d;}for(int i=1;i<=n*m;i++) swap(t[i],t[(x[i]%i)+1]);for(int i=1;i<=q;i++){int u,v;scanf("%d%d",&u,&v);swap(t[u],t[v]); }//预处理 for(int i=1;i<=n*m;i++) x[t[i]]=i;for(int i=1;i<=n;i++) l[i]=1,r[i]=m;//贪心 for(int i=1;i<=n*m;i++){int tx,ty;if(x[i]%m) tx=x[i]/m+1;//计算该数的行和列 else tx=x[i]/m;ty=x[i]%m;if(!ty) ty=m;if(ty>=l[tx]&&ty<=r[tx]){//如果在区间内 printf("%d ",i);if(++tot==n+m-1) return 0;//选择完成 for(int j=1;j<=n;j++){//更新区间 if(j<tx) r[j]=min(r[j],ty);//右上角不能选,但不能覆盖之前已剔除的区间 else if(j>tx) l[j]=max(l[j],ty);//左下角不能选,但不能覆盖之前已剔除的区间 }}}return 0;
} 

细节

空间限制仅 250MB,而 \(N\times M\) 高达 \(2.5\times 10^7\),一个 int 数组接近 100MB,最多开两个。而 \(x\) 数组计算完后不再使用,需再次利用,作为预处理位置的数组。

但计算递推式时仍需开 long long。

http://www.jsqmd.com/news/79185/

相关文章:

  • 基于Django的农场管理系统
  • rsync交叉编译步骤
  • 下载UCI数据集《Secondary Mushroom》
  • 【题解】P11453 [USACO24DEC] Deforestation S
  • 03 以上版本 Excel 文件解压替换图片
  • 【题解】Luogu P13977 数列分块入门 2
  • AI核心知识50——大语言模型之Scaling Laws(简洁且通俗易懂版)
  • MySQL 深分页查询优化实践与经验总结
  • P2014 [CTSC1997] 选课
  • 彻底讲清 MySQL InnoDB 锁机制:从 Record 到 Next-Key 的全景理解
  • 超越宣传:基于数据与案例的软件人才外包服务商价值评估指南
  • MCU的启动流程你了解么?
  • 电机多目标优化与灵敏度分析:探索电机性能提升之道
  • I2C通信最全面的讲解:从协议到硬件设计
  • 打造下一个爆款!专业短剧APP全栈开发解决方案,解锁万亿级市场红利
  • 毕业论文选题AI推荐:9大工具+热门方向合集
  • 【题解】Luogu P10752 [COI 2024] Sirologija
  • PFC2D预制裂隙巴西劈裂试验模拟:探索岩石破裂奥秘
  • Python字符串:别只用来打印!这5个高级用法让代码效率翻倍
  • PSRR仿真教程:解锁电路抗噪能力的密钥
  • C51_AH3144霍尔传感器
  • C51_74HC595串口转并口
  • 【题解】Atcoder ABC432 C
  • 赶due党救急!论文降重2小时搞定,不熬夜
  • 5 分钟快速入门 Gitlab CI/CD
  • 计算机论文模板推荐:8大平台+AI修改工具
  • 16 位 SAR ADC 逐次逼近型 ADC 模拟集成电路设计探秘
  • Lua语法深入1
  • 【题解】Luogu P13885 [蓝桥杯 2023 省 Java/Python A] 反异或 01 串
  • 期待回家,顺便写点年度总结