这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题……

首先我们先贴一下随机生成数组函数的代码:

 unsigned x = A, y = B, z = C;
unsigned rng61() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
}

这个函数的原理原谅我不太懂,就不多说了-_-||。

接下来来谈一下stl中的一个nth_element函数,这个函数对于一个数组、容器(我们就用最普通的数组a来进行讨论),假设我们需要求这个数组中的第k个元素,那么我们只需nth_element(a,a+k,a+n)(下标从0开始),那么a中第k小的数将会出现在第k个位置,且能够保证前k-1个元素都比它小,后面的元素都比它大(但是这两堆数是无序的),复杂度为O(n),该函数的一般用法为:nth_element(开始位置,所求位置,结束位置)。stl是个神奇的东西,里面还有max_element,min_element函数,具体用法请点击链接:http://www.cnblogs.com/Dillonh/p/9042456.html。

顺便贴一下这几天做的两道题:

第一道为昨天牛客多校的J题Heritage of skywalkert,题目链接:https://www.nowcoder.com/acm/contest/144/J

题目:

题意:用随机生成数组函数生成n个数,求这n个数中两两的lcm(最小公倍数)的最大值,n的范围为2e6.

思路:虽说要n个,但是我们只需要取出100个最大的即可,因为据证明两个数互质的概率为(具体证明请自行百度),所以我们只需将这100个数求次lcm即可。

代码实现如下:

 #include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;;
typedef pair<int, int> pii;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = 1e7 + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f; int tt, n;
unsigned int x, y, z;
ull num[maxn]; unsigned int tang() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
} ull gcd(ull a, ull b) {
return b == ? a : gcd(b, a % b);
} int main() {
//FIN;
scanf("%d", &tt);
int icase = ;
while(tt--) {
scanf("%d%u%u%u", &n, &x, &y, &z);
for(int i = ; i < n; i++) {
num[i] = tang();
}
ull mx = ;
if(n > ) {
int tmp = n - ;
nth_element(num, num + tmp, num + n);
for(int i = tmp; i < n; i++) {
for(int j = tmp; j < n; j++) {
ull tt = num[i] / gcd(num[i], num[j]) * num[j];
mx = mx > tt ? mx : tt;
}
}
} else {
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++) {
ull tt = num[i] / gcd(num[i], num[j]) * num[j];
mx = mx > tt ? mx : tt;
}
}
}
printf("Case #%d: %llu\n", ++icase, mx);
}
return ;
}

第二题是2017年杭电多校的题目,Hints of sd0061(HDU6040:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6040

题目:

题意:用随机生成数组函数生成n个数,且求出第bi+1位的数,n的范围为1e7。

思路:这题照样需要借助nth_element函数,但是由于n太大,再加上要求m个数,复杂度妥妥地T,所以我们要想点优化,我们知道nth_element的复杂度是与所求范围来决定的,且nth_element函数会将大于某个数小于某个数分开,那么我们可以借助先求出排在后面的数,再求排在前面的数,逐步将范围缩小,从而缩小范围。

代码实现如下:

 #include <cstdio>
#include <algorithm>
using namespace std; const int maxn = 1e7 + ; int n, m;
pair<int, int> b[];
unsigned a[maxn], num[maxn];
unsigned x, y, z; unsigned rng61() {
unsigned t;
x ^= x << ;
x ^= x >> ;
x ^= x << ;
t = x;
x = y;
y = z;
z = t ^ x ^ y;
return z;
} int main() {
int icase = ;
while(~scanf("%d", &n)) {
scanf("%d%u%u%u", &m, &x, &y, &z);
for(int i = ; i < m; i++) {
scanf("%d", &b[i].first);
b[i].second = i;
}
sort(b, b + m);
b[m].first = n;
for(int i = ; i < n; i++) {
a[i] = rng61();
}
printf("Case #%d:", ++icase);
for(int i = m - ; i >= ; i--) {
nth_element(a, a + b[i].first, a + b[i+].first);
num[b[i].second] = a[b[i].first];
}
for(int i = ; i < m; i++) {
printf(" %u", num[i]);
}
printf("\n");
}
return ;
}

随机生成数组函数+nth-element函数的更多相关文章

  1. 学习笔记之Java队列Queue中offer/add函数,poll/remove函数,peek/element函数的区别

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...

  2. PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

    Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...

  3. JavaScript---js语法,数据类型及方法, 数组及方法,JSON对象及方法,日期Date及方法,正则及方法,数据类型转换,运算符, 控制流程(三元运算),函数(匿名函数,自调用函数)

    day46 一丶javascript介绍 JavaScript的基础分为三个       1.ECMAScript:JavaScript的语法标准.包括变量,表达式,运算符,函数,if语句,for语句 ...

  4. PHP函数积累总结(Math函数、字符串函数、数组函数)

    Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...

  5. 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

    今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...

  6. 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组

    1. 最朴素暴力的做法. void cal1() { , j = , num = ; int result[M]; result[] = rand() % N; //第一个肯定不重复, 直接加进去 ; ...

  7. php数组函数(分类基本数组函数,栈函数,队列)

    php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...

  8. javascript 数组的常用操作函数

    join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为“,”). 与之相反的一个方法是:Stri ...

  9. 精读JavaScript模式(四),数组,对象与函数的几种创建方式

    一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...

随机推荐

  1. 搭建github

    http://www.cnblogs.com/liuxianan/p/build-blog-website-by-hexo-github.html

  2. win7 php连接远程oracle

    <?php /* 先下载oracle客户端 下载地址 http://www.oracle.com/technetwork/topics/winx64soft-089540.html 下载如下三个 ...

  3. 20个实用的Linux命令

    20个实用的Linux命令 2016-04-16 程序员之家 1. 命令:sl (蒸汽机车) 你可能了解 ‘ls’ 命令,并经常使用它来查看文件夹的内容.但是,有些时候你可能会拼写成 ‘sl’ ,这时 ...

  4. dev_queue_xmit 发生了什么?skb还会在哪里缓存

    见 codebox/net/qdisk/xmit.log中保存了一份记录 调用关系 sch_direct_xmit --> dev_hard_start_xmit --> xmit_one ...

  5. java基础简介

    一.软件开发 软件:是由数据和指令组成的(例:计算器) 如何实现软件开发呢?    就是使用开发工具和计算机语言做出东西来 二.常用dos命令 d: 回车 盘符切换 dir(directory):列出 ...

  6. BZOJ 1452 Count(二维树状数组)

    大水题. 建立100个二维树状数组,总复杂度就是O(qlognlogm). # include <cstdio> # include <cstring> # include & ...

  7. 【bzoj1614】[Usaco2007 Jan]Telephone Lines架设电话线 二分+SPFA

    题目描述 Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1 ...

  8. JavaScript词法分析解析

    函数在调用之前,会进行词法分析或者叫语法分析: 1. 函数在形成调用的那一瞬间,会有一个活动对象叫 active object ,简称AO,会分析如下几条: 形式参数 函数内局部变量声明 函数声明表达 ...

  9. Gevent-自动挡切换

    Gevent: Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程. G ...

  10. PKUWC2019 酱油记

    目录 PKUWC2019 酱油记 day0 Day1 Day2 Day3 Day4 PKUWC2019 酱油记 day0 早上从镇中出发到栎社机场,然后才了解到原来充电宝电脑是必须随身(原以为必须托运 ...