LINK:随机数生成器

观察数据范围还是可以把矩阵给生成出来的。

考虑如何求出答案。题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题.

所以要从大到小选数字 考虑选择一个数字后哪些位置不合法 左下右上不合法。

问题之后变成了 一个二维数点问题 最快也就log^2

实际上我们发现每次覆盖的是一个矩形 可以直接暴力把矩形给标记了。

如果是左下矩形可以暴力从右上到左下进行标记.遇到被标记的就break.

总复杂度还是线性的.

不过这个需要两个\(n\cdot m\)的数组 不能多开 不然MLE.

另外一种做法是考虑会修改的数字是\(n+m-1\)个 可以每次修改的时候可以\(O(m)\)的修改每一列的状态也可以判断.

空间复杂度都差不多.真要比的话 前者空间小.

code
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<queue>
#include<deque>
#include<stack>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define inf 100000000000000000ll
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007ll
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-10
#define sq sqrt
#define S second
#define F first
#define mod 1000000007
#define id(i,j) ((i-1)*m+j)
#define max(x,y) ((x)<(y)?y:x)
using namespace std;
char *fs,*ft,buf[1<<15];
inline char gc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;
}
const int MAXN=5010,maxn=MAXN*MAXN;
int n,m,ww,Q;
int x0,A,B,C,D;
int a[maxn],b[maxn];
inline int F(int x){return ((ll)A*x%D*x+(ll)b*x+C)%D;}
int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
get(x0);get(A);get(B);get(C);get(D);
get(n);get(m);get(Q);
//cout<<x0<<' '<<A<<' '<<B<<' '<<C<<' '<<D<<endl;
rep(1,n*m,i)
{
x0=((ll)A*x0%D*x0+(ll)B*x0+C)%D;
//cout<<x0<<endl;
a[i]=i;swap(a[(x0%i)+1],a[i]);
}
//rep(1,n*m,i)cout<<a[i]<<endl;
rep(1,Q,i)swap(a[read()],a[read()]);
//rep(1,n*m,i)cout<<a[i]<<endl;
rep(1,n*m,i)b[a[i]]=i,a[i]=0;
rep(1,n*m,i)
{
if(a[b[i]])continue;
printf("%d ",i);
int x=b[i]/m+1,y=b[i]-(x-1)*m;
if(!y)--x,y=m;
fep(x-1,1,l)
{
if(a[id(l,y+1)])break;
rep(y+1,m,r)
{
if(a[id(l,r)])break;
a[id(l,r)]=1;
}
}
rep(x+1,n,l)
{
if(a[id(l,y-1)])break;
fep(y-1,1,r)
{
if(a[id(l,r)])break;
a[id(l,r)]=1;
}
}
}
return 0;
}

luogu P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力的更多相关文章

  1. [luogu] P2354 [NOI2014]随机数生成器 (贪心)

    Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...

  2. [bzoj3671][Noi2014][随机数生成器] (贪心+位运算+卡空间)

    Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...

  3. BZOJ3671: [Noi2014]随机数生成器(贪心)

    Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 2098  Solved: 946[Submit][Status][Discuss] Descripti ...

  4. 【bzoj3671】[Noi2014]随机数生成器 贪心

    题目描述 输入 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M 的排列来填入她 N ...

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

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

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

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

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

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

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

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

  9. NOI2014 随机数生成器

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

随机推荐

  1. linux新用户(组)的那些事

    linux新用户(组)的那些事   创建新用户 groupadd bigdata //添加新用户组bigdata useradd -g bigdata es //-g:为用户组添加新用户 passwd ...

  2. mysql数据库 创建、查看、重命名、复制和删除的基本操作

    在数据库中,表是最重要.最基本的对象,是存储数据的基本单位.数据表从哪里来呢?数据表由关系模式转换而来.但不是简单的转换. 在设计表结构时要考虑下面几个方面: 字段名要通俗易懂且具有代表性,字段名不允 ...

  3. 用Kubernetes部署Springboot或Nginx,也就一个文件的事

    1 前言 经过<Maven一键部署Springboot到Docker仓库,为自动化做准备>,Springboot的Docker镜像已经准备好,也能在Docker上成功运行了,是时候放上Ku ...

  4. 浏览器如何解析css选择器?

    浏览器会『从右往左』解析CSS选择器. 我们知道DOM Tree与Style Rules合成为 Render Tree,实际上是需要将Style Rules附着到DOM Tree上, 因此需要根据选择 ...

  5. java 数据结构(二):java常用类 二 StringBuffer、StringBuilder

    1.String.StringBuffer.StringBuilder三者的对比String:不可变的字符序列:底层使用char[]存储StringBuffer:可变的字符序列:线程安全的,效率低:底 ...

  6. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  7. SpringBoot2 整合JTA组件,多数据源事务管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.JTA组件简介 1.JTA基本概念 JTA即Java-Transaction-API,JTA允许应用程序执行分布式事务处理,即在两个或多个 ...

  8. C#生成Excel文档(EPPlus)

    1.公式计算 worksheet.Cells["D2:D5"].Formula = "B2*C2";//这是乘法的公式,意思是第二列乘以第三列的值赋值给第四列, ...

  9. 【Nginx】如何格式化日志并推送到远程服务器?看完原来很简单!!

    写在前面 Nginx作为最常用的反向代理和负载均衡服务器,被广泛的应用在众多互联网项目的前置服务中,很多互联网项目直接将Nginx服务器作为整个项目的流量入口.这就使得我们可以通过对Nginx服务器日 ...

  10. 转:Oracle 数据泵详解

    一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...