贪心


  嗯……其实生成这个矩阵就是一个$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上面搞,就可以了= =

 /**************************************************************
Problem: 3671
User: Tunix
Language: C++
Result: Accepted
Time:29944 ms
Memory:197448 kb
****************************************************************/ //BZOJ 3671
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/ int n,m,Q,mp[N][N],l[N],r[N];
int x0,a,b,c,d;
inline int ran(){return x0=((LL)x0*x0*a+(LL)x0*b+c)%d;}
typedef pair<short,short> pii;
#define mk make_pair
pii pos[N*N];
int ans[N+N],cnt; int main(){
#ifndef ONLINE_JUDGE
freopen("3671.in","r",stdin);
freopen("3671.out","w",stdout);
#endif
x0=getint(),a=getint(),b=getint(),c=getint(),d=getint();
n=getint(); m=getint(); Q=getint();
F(i,,n) F(j,,m) mp[i][j]=(i-)*m+j;
F(i,,n*m){
int x1=i/m+,y1=i%m,t=ran()%i+,x2=t/m+,y2=t%m;
if (!y1) x1--,y1=m;
if (!y2) x2--,y2=m;
swap(mp[x1][y1],mp[x2][y2]);
}
int x,y;
F(i,,Q){
x=getint(),y=getint();
int x1=x/m+,y1=x%m,x2=y/m+,y2=y%m;
if (!y1) x1--,y1=m;
if (!y2) x2--,y2=m;
swap(mp[x1][y1],mp[x2][y2]);
}
F(i,,n) F(j,,m){
pos[mp[i][j]]=mk((short)i,(short)j);
} F(i,,n) l[i]=,r[i]=m;
F(i,,n*m){
if (cnt==n+m-) break;
int x=pos[i].first,y=pos[i].second;
// printf("pos[%d]=(%d,%d)\n",i,x,y);
if (l[x]<=y && r[x]>=y){
ans[++cnt]=i;
F(i,,x-) r[i]=min(y,r[i]);
F(i,x+,n) l[i]=max(y,l[i]);
}
// F(i,1,n) printf("l[%d]=%d r[%d]=%d\n",i,l[i],i,r[i]);
// puts("");
}
F(i,,cnt-) printf("%d ",ans[i]);
printf("%d",ans[cnt]);
return ;
}

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. thinkphp中常用的模板变量

    在thinkphp中的模板要加载静态文件如css,js等文件时要经常用到模板常量. 假如项目放在/web/shop中,则如下所示对应常量的输出值: 1 2 3 4 5 6 7 8 9 // 不含域名 ...

  2. JQuery实现最字体的放大缩小

    网页常常有对字体放大缩小的需求,我们不妨来看一下下面这段JQuery代码的实现. 假如在html页面代码中我们有这么一段代码: <p>啦啦啦啦啦啦啦啦啦啦</p> 那么JQue ...

  3. 深度学习常用数据集 API(包括 Fashion MNIST)

    基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...

  4. python 关键知识点

    学习资源:笨方法学习 python3 将变量传递给脚本--argv 脚本:你编写的 .py 文件. argv 参数变量(argument variable)保存着你运行 python 脚本的参数. i ...

  5. volatile 和锁的内存语义

    一.volatile 的内存语义 1. volatile 的特性 volatile变量自身具有以下特性: 可见性 :对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后 ...

  6. Stream中reduce()使用记录

    一.reduce()使用1.第一个参数是我们给出的初值,2.第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法 3.最后reduce会返回计算后的结果 Bi ...

  7. insert ignore duplicate key

    Insert into T1select * from T2  where NOT EXISTS (select 1 from T1 X where X.GUID=T2.GUID);

  8. Initializing the FallBack certificate failed . TDSSNIClient initialization failed

    安装SQL后服务不能启动,报错: 2014-03-24 14:33:10.06 spid13s     Error: 17190, Severity: 16, State: 1.2014-03-24 ...

  9. iOS 11开发教程(十)iOS11无线连接手机真机测试

    iOS 11开发教程(十)iOS11无线连接手机真机测试 在Xcode 9.0中,已经可以通过无线连接手机进行真机测试了.具体的操作步骤如下: (1)首先需要使用数据线将手机连接到苹果电脑上. (2) ...

  10. 二分搜索之C++实现

    二分搜索之C++实现 一.源代码:BinarySearch.cpp #include<iostream> using namespace std; /*定义输出一维数组的函数*/ void ...