【bzoj3671】[Noi2014]随机数生成器 贪心
题目描述
.jpg)
输入
第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子。第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M 的排列来填入她 N 行 M 列的棋盘,并且小H在初始的 N×M 次交换操作后,又进行了 Q 次额外的交换操作。接下来 Q 行,第 i 行包含两个整数 u_i,v_i,表示第 i 次额外交换操作将交换 T_(u_i )和 T_(v_i ) 的值。
输出
输出一行,包含 N+M-1 个由空格隔开的正整数,表示可以得到的字典序最小的路径序列。
样例输入
1 3 5 1 71
3 4 3
1 7
9 9
4 9
样例输出
1 2 6 8 9 12
题目大意
给定你一个用乱七八糟的方法生成的n*m的矩阵,矩阵中的元素是1~n*m的全排列,问从左上走到右下的路径中,把经过的元素从小到大排序后得到的字典序最小的路径是什么
题解
贪心
其实我真不知道出题人是怎么想的,题目描述搞得和数论似的,结果目的就是给出这个序列 = =
显然要考虑从小到大的n*m个数,如果能选就选,选了就更新其它不能选的位置。
如果一个点被选择,那么它的严格左下方和严格右上方的点都不能被选择,开一个标记数组记录它。
如果扫到一个点,它已经被标记过,那么它的左下(或右上)的点一定都被标记过。适当终止循环,时间复杂度是均摊$O(nm)$的。
但是本题卡内存差评,所以不能开数组记录每次的x,标记数组必须开成bool的等等。
另外本题需要使用桶排序,否则会TLE。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int val[25000010] , pos[25000010];
bool tag[5010][5010];
int main()
{
int a , b , c , d , n , m , k , q , i , jx , jy , px , py , cnt = 0;
long long x;
scanf("%lld%d%d%d%d%d%d%d" , &x , &a , &b , &c , &d , &n , &m , &q) , k = n * m;
for(i = 1 ; i <= k ; i ++ ) val[i] = i , x = (a * x * x + b * x + c) % d , pos[i] = (int)x;
for(i = 1 ; i <= k ; i ++ ) swap(val[i] , val[pos[i] % i + 1]);
while(q -- ) scanf("%d%d" , &px , &py) , swap(val[px] , val[py]);
for(i = 1 ; i <= k ; i ++ ) pos[val[i]] = i;
for(i = 1 ; i <= k ; i ++ )
{
px = (pos[i] - 1) / m + 1 , py = (pos[i] - 1) % m + 1;
if(!tag[px][py])
{
printf("%d%c" , i , ++cnt == n + m - 1 ? '\n' : ' ');
if(py > 1)
{
for(jx = px + 1 ; jx <= n ; jx ++ )
{
if(tag[jx][py - 1]) break;
for(jy = py - 1 ; jy >= 1 ; jy -- )
{
if(tag[jx][jy]) break;
tag[jx][jy] = 1;
}
}
}
if(py < m)
{
for(jx = px - 1 ; jx >= 1 ; jx -- )
{
if(tag[jx][py + 1]) break;
for(jy = py + 1 ; jy <= m ; jy ++ )
{
if(tag[jx][jy]) break;
tag[jx][jy] = 1;
}
}
}
}
}
return 0;
}
【bzoj3671】[Noi2014]随机数生成器 贪心的更多相关文章
- BZOJ3671: [Noi2014]随机数生成器(贪心)
Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 2098 Solved: 946[Submit][Status][Discuss] Descripti ...
- [bzoj3671][Noi2014][随机数生成器] (贪心+位运算+卡空间)
Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...
- luogu P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力
LINK:随机数生成器 观察数据范围还是可以把矩阵给生成出来的. 考虑如何求出答案.题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题. 所以要从大到小选数字 考虑选择一 ...
- BZOJ3671 [Noi2014]随机数生成器 【贪心】
题目链接 BZOJ3671 题解 模拟题意生成矩阵贪心从小选择即可 每选择一个,就标记其左下右上矩阵 由于每次都是标记一个到边界的矩阵,所以一旦遇到标记过就直接退出即可,可以保证复杂度 还有就是空间和 ...
- bzoj3671 [Noi2014]随机数生成器
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3671 [题解] 贪心从1...n*m取,开两个5000*5000的数组就够了,可以重复利用, ...
- bzoj 3671 [Noi2014]随机数生成器——贪心(时间复杂度分配)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 设 x 为一个点的行号, y 为一个点的列号:原本想着判断一个点能不能选就是看选了的点 ...
- [luogu] P2354 [NOI2014]随机数生成器 (贪心)
Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...
- [BZOJ3671][UOJ#6][NOI2014]随机数生成器
[BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...
- 【BZOJ3671】[Noi2014]随机数生成器 暴力
[BZOJ3535][Noi2014]随机数生成器 Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个 ...
随机推荐
- Java 堆内存和栈内存
看了一些别人总结的博客,感觉对堆内存和栈内存有了一个初步的认识.所以来写写自己对堆内存和栈内存的理解. Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象 ...
- 重置Mysql的root密码及用户权限设置
一.重置Mysql的root密码 方法一: 直接进入localhost/phpmyadmin修改用户root的权限,设置密码: 方法二: 进入mysql控制台:mysql->use mysql ...
- IOS7适配
(1)如果应用程序始终隐藏 status bar 那么恭喜呢,你在UI上需要的改动很少很少. (2)如果应用程序显示status bar,可以讲status bar设置成黑色不透明 ,然后在UIVie ...
- jmeter中通过beanshell访问eclipse中导出jar中的java类的方法
主要步骤 1.在eclipse中导出要引用的java代码为jar文件 2.将生成的jar文件放到jmeter的lib的ext目录下 3.在jmeter的jsr223处理器中导入要引用的java类型文件 ...
- Hyperledger Fabric on SAP Cloud Platform
今天的文章来自Wen Aviva, 坐Jerry面对面的程序媛. Jerry在之前的公众号文章<在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图>已经介绍过Aviva ...
- 访问修饰符(C# 参考)
第一篇 就抄写了一下下MSDN上面的东西练练手吧!!! 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性. 本节介绍四个访问修饰符: public protected ...
- 用函数创建对象、类创建对象,以及使用prototype的好处
用函数创建对象 var CheckObject = function(){}; CheckObject.checkName = function(){ // 检验姓名 }; CheckObject.c ...
- for循环输出i为同一值的问题
使用闭包将变量i的值保护起来. //sava1:加一层闭包,i以函数参数形式传递给内层函数 for( var i=0; i<ps.length; i++ ) { (function(arg){ ...
- 后台返回数据为treeList结构,如何添加属性(递归添加属性)
给tree形json数据添加默写属性(递归)addAttr(data){ for (var j = 0; j < data.length; j++) { data[j].title = data ...
- Linux内核漏洞利用-环境配置(转)
实验环境: Ubuntu-14.04.1 x86 linux-2.6.32.1 busybox-1.27.2 qemu 0x00 安装qemu sudo apt-get install qemu qe ...