贪心


  嗯……其实生成这个矩阵就是一个$O(n^2)$的模拟 = =

  然后?字典序最小?贪心呗= =能选1就选1,然后能选2就选2……

  我们发现,对于矩阵(1,1)~(n,m),假设1的位置是(x,y),那么我们选完1以后,可选的范围变成了:(1,1)~(x,y) & (x,y)~(n,m),也就是将一个矩阵拆成四块,我们可以在左上和右下两块中递归地进行选择……

  那么我们每次选完之后,新的可选的范围其实暴力O(n)维护就可以了,因为我们总共只选$O(n)$次,每次维护的复杂度是$O(n)$,总复杂度还是$O(n^2)$

  至于卡空间这个问题……由于开一个5000*5000的int就是100M,所以我一开始开了个T数组先算出来,然后再生成map[i][j],这样的做法是会爆的……(因为还存了个pos[i],保存 i 这个数的坐标,这个可以用short,需要100M)

  所以改进了一下:不生成T数组,直接在map上面搞,就可以了= =

  1. /**************************************************************
  2. Problem: 3671
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:29944 ms
  7. Memory:197448 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 3671
  11. #include<vector>
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<cstdlib>
  15. #include<iostream>
  16. #include<algorithm>
  17. #define rep(i,n) for(int i=0;i<n;++i)
  18. #define F(i,j,n) for(int i=j;i<=n;++i)
  19. #define D(i,j,n) for(int i=j;i>=n;--i)
  20. #define pb push_back
  21. using namespace std;
  22. inline int getint(){
  23. int v=,sign=; char ch=getchar();
  24. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  25. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  26. return v*sign;
  27. }
  28. const int N=,INF=~0u>>;
  29. typedef long long LL;
  30. /******************tamplate*********************/
  31.  
  32. int n,m,Q,mp[N][N],l[N],r[N];
  33. int x0,a,b,c,d;
  34. inline int ran(){return x0=((LL)x0*x0*a+(LL)x0*b+c)%d;}
  35. typedef pair<short,short> pii;
  36. #define mk make_pair
  37. pii pos[N*N];
  38. int ans[N+N],cnt;
  39.  
  40. int main(){
  41. #ifndef ONLINE_JUDGE
  42. freopen("3671.in","r",stdin);
  43. freopen("3671.out","w",stdout);
  44. #endif
  45. x0=getint(),a=getint(),b=getint(),c=getint(),d=getint();
  46. n=getint(); m=getint(); Q=getint();
  47. F(i,,n) F(j,,m) mp[i][j]=(i-)*m+j;
  48. F(i,,n*m){
  49. int x1=i/m+,y1=i%m,t=ran()%i+,x2=t/m+,y2=t%m;
  50. if (!y1) x1--,y1=m;
  51. if (!y2) x2--,y2=m;
  52. swap(mp[x1][y1],mp[x2][y2]);
  53. }
  54. int x,y;
  55. F(i,,Q){
  56. x=getint(),y=getint();
  57. int x1=x/m+,y1=x%m,x2=y/m+,y2=y%m;
  58. if (!y1) x1--,y1=m;
  59. if (!y2) x2--,y2=m;
  60. swap(mp[x1][y1],mp[x2][y2]);
  61. }
  62. F(i,,n) F(j,,m){
  63. pos[mp[i][j]]=mk((short)i,(short)j);
  64. }
  65.  
  66. F(i,,n) l[i]=,r[i]=m;
  67. F(i,,n*m){
  68. if (cnt==n+m-) break;
  69. int x=pos[i].first,y=pos[i].second;
  70. // printf("pos[%d]=(%d,%d)\n",i,x,y);
  71. if (l[x]<=y && r[x]>=y){
  72. ans[++cnt]=i;
  73. F(i,,x-) r[i]=min(y,r[i]);
  74. F(i,x+,n) l[i]=max(y,l[i]);
  75. }
  76. // F(i,1,n) printf("l[%d]=%d r[%d]=%d\n",i,l[i],i,r[i]);
  77. // puts("");
  78. }
  79. F(i,,cnt-) printf("%d ",ans[i]);
  80. printf("%d",ans[cnt]);
  81. return ;
  82. }

3671: [Noi2014]随机数生成器

Time Limit: 50 Sec  Memory Limit: 256 MB
Submit: 774  Solved: 374
[Submit][Status][Discuss]

Description

Input


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 )
的值。

Output

输出一行,包含 N+M-1 个由空格隔开的正整数,表示可以得到的字典序最小的路径序列。

 

Sample Input

1 3 5 1 71
3 4 3
1 7
9 9
4 9

Sample Output

1 2 6 8 9 12

HINT

本题的空间限制是 256 MB,请务必保证提交的代码运行时所使用的总内存空间不超过此限制。

一个32位整数(例如C/C++中的int和Pascal中的Longint)为4字节,因而如果在程序中声明一个长度为 1024×1024 的32位整型变量的数组,将会占用 4 MB 的内存空间。

2≤N,M≤5000

0≤Q≤50000

0≤a≤300

0≤b,c≤108

0≤x0<d≤108

1≤ui,vi≤N×M

Source

[Submit][Status][Discuss]

【BZOJ】【3671】【NOI2014】随机数生成器的更多相关文章

  1. bzoj 3671 [Noi2014]随机数生成器——贪心(时间复杂度分配)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3671 设 x 为一个点的行号, y 为一个点的列号:原本想着判断一个点能不能选就是看选了的点 ...

  2. BZOJ 3671 NOI2014 随机数生成器

    这题其实是个暴力. 首先那一堆如何构造n*m方格的东西都是在玩你. 构造出来方阵后,由于是一个排列,不存在重复,可以大力贪心. 每次将选出一个最小的元素,然后将它右上左下的元素全部打上标记(记得bre ...

  3. bzoj 3671: [Noi2014]随机数生成器【模拟+贪心】

    降智好题 前面随机部分按照题意模拟,然后字典序贪心,也就是记录每个值的位置从1~nm依次看能不能取,能取的话更新行的取值范围(它上面的行一定取的列小于等于这个数取的列,下面行大于等于) #includ ...

  4. [BZOJ3671][UOJ#6][NOI2014]随机数生成器

    [BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...

  5. 【BZOJ3671】[Noi2014]随机数生成器 暴力

    [BZOJ3535][Noi2014]随机数生成器 Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个 ...

  6. BZOJ_3671_[Noi2014]随机数生成器_set+贪心

    BZOJ_3671_[Noi2014]随机数生成器_set Description   Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第 ...

  7. NOI2014 随机数生成器

    随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...

  8. BZOJ 2875: [Noi2012]随机数生成器( 矩阵快速幂 )

    矩阵快速幂...+快速乘就OK了 ----------------------------------------------------------------------------------- ...

  9. Bzoj 2875: [Noi2012]随机数生成器(矩阵乘法)

    2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2052 Solved: 1118 Description ...

  10. luogu P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力

    LINK:随机数生成器 观察数据范围还是可以把矩阵给生成出来的. 考虑如何求出答案.题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题. 所以要从大到小选数字 考虑选择一 ...

随机推荐

  1. Django实战(12):增加目录页,设定统一布局

    针对上一节的新需求,界面设计师还为我们设计了一个新的界面,不仅仅是目录页,还包含了站点的整体风格,如下图: 感谢界面设计师为我们提供的“又黑又硬”的工具条,这个看起来真的很酷.下面,让我们来享用她的工 ...

  2. Cordova 打包签名

    1.第一步 在项目根目录下运行命令cordova build --release android,会在testApp\platforms\android\build\outputs\apk目录下生成一 ...

  3. react篇章-React State(状态)-将生命周期方法添加到类中

    将生命周期方法添加到类中 在具有许多组件的应用程序中,在销毁时释放组件所占用的资源非常重要. 每当 Clock 组件第一次加载到 DOM 中的时候,我们都想生成定时器,这在 React 中被称为挂载. ...

  4. matplotlib 中文显示 的问题

    第一种方法 from pylab import mpl import numpy as np mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 ...

  5. web服务端安全之暴力破解

    一.暴力破解 指攻击者通过遍历或字典的方式,向目标发起大量请求,通过判断返回数据包的特征来找出正确的验证信息,从而绕过验证机制. 二.常见场景 用户登录处的账号密码暴力破解: 人机验证机制容易绕过,如 ...

  6. 深入解释yield和Generators

    生成器和yield关键字可能是Python里面最强大的最难理解的概念之一(或许没有之一), 但是并不妨碍yield成为Python里面最强大的关键字,对于初学者来讲确实非常难于理解,来看一篇关于yie ...

  7. leetcode 奇偶链表 python

    要求空间复杂度O(1) 那就只能用指针不断改链表的指针, 不能建立新的内存 时间复杂度O(1) 一遍遍历 不能嵌套循环 我的思想是: 1 如果链表元素数量小于等于2个,那就无法操作 2 能操作的情况下 ...

  8. BZOJ 1212 [HNOI2004]L语言 【AC自动机 + 背包】

    题目链接[http://www.lydsy.com/JudgeOnline/problem.php?id=1212] 题意:给你一些单词,然后给出一个没有标点的文本串S,都是小写字符.现在让你求用给出 ...

  9. 工作中怎么解决bug

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 1,看日志 2,看日志解决不了,断点调试 3,网络搜索.

  10. CF961E Tufurama 主席树

    对原问题进行转化 考虑对每个$i$,询问在$j \in [i + 1, a[i]]$中满足$a[j] \geqslant i$的个数 这样子可以做到不重不漏 个数满足差分的性质,使用主席树来维护即可 ...