题目名称 | 1767. [NOI 2014]随机数生成器 |
---|---|
输入输出 | random_2014.in/out |
难度等级 | ★★★☆ |
时间限制 | 5000 ms (5 s) |
内存限制 | 256 MiB |
测试数据 | 10 |
题目来源 | Asm.Def 于2014-10-23加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:25, 提交:86, 通过率:29.07% | ||||
_Itachi | 100 | 10.662 s | 191.08 MiB | C++ |
Imone NOI2018Au | 100 | 12.068 s | 191.10 MiB | C++ |
allamend | 100 | 12.192 s | 191.50 MiB | C++ |
Anonymity | 100 | 13.153 s | 214.91 MiB | C++ |
fhr | 100 | 14.645 s | 215.40 MiB | C++ |
test | 100 | 14.667 s | 215.40 MiB | C++ |
Asm.Def | 100 | 14.942 s | 191.09 MiB | C++ |
JSX | 100 | 15.670 s | 191.10 MiB | C++ |
Ostmbh | 100 | 15.898 s | 191.47 MiB | C++ |
Satoshi | 100 | 15.959 s | 191.14 MiB | C++ |
关于 随机数生成器 的近10条评论(全部评论) | ||||
---|---|---|---|---|
这道题从uoj上过了后来这里连着M3次(uoj算得是使用的内存)
_Itachi
2017-05-28 20:28
4楼
| ||||
智障,N*M个询问,(N+M-1)个修改,我居然用RMQ,真是智障!
| ||||
总之fread不可过QAQ
ztx
2015-06-24 15:13
2楼
| ||||
这题总算是在2014年末尾填上了……
参加同步赛的时候我只看出了这里每次可以贪心选取一个子矩阵中最小的元素,用它把矩阵分割成两个具有一个公共元素的子矩阵再递归处理。于是我就写了个二维RMQ,结果交上去内存爆了(估计不爆也会超时…)后来看题解才知道这是个相当机智的暴力…… |
小H最近在研究随机算法。随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性。事实上,随机数生成函数也并不是真正的“随机”,其一般都是利用某个算法计算得来的。比如,下面这个二次多项式递推算法就是一个常用算法:算法选定非负整数 $x_0,a,b,c,d$ 作为随机种子,并采用如下递推公式进行计算:
$$x_i = ( a * x_{i-1}^{2} + b * x_{i-1} + c ) \mod d $$
对于任意 $i≥1$,这样可以得到一个任意长度的非负整数数列{$x_i$ }$(i≥1)$,一般来说,我们认为这个数列是随机的。利用随机序列{$x_i$}$(i≥1)$,我们还可以采用如下算法来产生一个1到K的随机排列{$T_i$}$(i=1)$K:初始设T为1到K的递增序列;对T进行K次交换,第i次交换,交换 $T_i$ 和 $T((x(i) \mod i)+1)$ 的值。此外,小H在这 K 次交换的基础上,又额外进行了 Q 次交换操作,对于第 i 次额外交换,小H会选定两个下标 $u_i$ 和 $v_i$,并交换\( T_{u_i}\)和\( T_{v_i}\) 的值。为了检验这个随机排列生成算法的实用性,小H设计了如下问题:小H有一个 N 行 M 列的棋盘,她首先按照上述过程,通过 N×M+Q
次交换操作,生成了一个 1~N×M 的随机排列
${T_i}_{(i=1,N×M)}$,
然后将这 N×M 个数逐行逐列依次填入这个棋盘:也就是第 i 行第 j 列的格子上所填入的数应为
$T_{(i-1)M+j}$。
接着小H希望从棋盘的左上角,也就是第一行第一列的格子出发,每次向右走或者向下走,在不走出棋盘的前提下,走到棋盘的右下角,也就是第 N 行第 M 列的格子。小H把所经过格子上的数字都记录了下来,并从小到大排序,这样,对于任何一条合法的移动路径,小H都可以得到一个长度为 N+M-1 的升序序列,我们称之为路径序列。小H想知道,她可能得到的字典序最小的路径序列应该是怎样的呢?
输入的第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
$2<=n,m<=5000$
$0<=q<=50000$
$0<=a<=300$
$0<=b,c<=10^8$
$0<=x_0<d<=10^8$
$1<=v_i,u_i<=n·m$
NOI2014 day2 B.