随机生成数组函数+nth-element函数
这几天做了几道随机生成数组的题,且需要用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函数的更多相关文章
- 学习笔记之Java队列Queue中offer/add函数,poll/remove函数,peek/element函数的区别
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用. Java中Que ...
- PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。
Python 练习 标签: Python Python练习题 Python知识点 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的 ...
- JavaScript---js语法,数据类型及方法, 数组及方法,JSON对象及方法,日期Date及方法,正则及方法,数据类型转换,运算符, 控制流程(三元运算),函数(匿名函数,自调用函数)
day46 一丶javascript介绍 JavaScript的基础分为三个 1.ECMAScript:JavaScript的语法标准.包括变量,表达式,运算符,函数,if语句,for语句 ...
- PHP函数积累总结(Math函数、字符串函数、数组函数)
Math函数:10个较常用标红.abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切ata ...
- 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...
- 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
1. 最朴素暴力的做法. void cal1() { , j = , num = ; int result[M]; result[] = rand() % N; //第一个肯定不重复, 直接加进去 ; ...
- php数组函数(分类基本数组函数,栈函数,队列)
php数组函数(分类基本数组函数,栈函数,队列函数) 一.总结 1.常用数组函数 函数 描述 array() 创建数组. array_combine() 通过合并两个数组来创建一个新数组. array ...
- javascript 数组的常用操作函数
join() Array.join(/* optional */ separator) 将数组转换为字符串,可带一个参数 separator (分隔符,默认为“,”). 与之相反的一个方法是:Stri ...
- 精读JavaScript模式(四),数组,对象与函数的几种创建方式
一.前言 放了个元旦,休息了三天,加上春运抢票一系列事情的冲击,我感觉我的心已经飞了.确实应该收收心,之前计划的学习任务也严重脱节了:我恨不得打死我自己. 在上篇博客中,笔记记录到了关于构造函数方面的 ...
随机推荐
- Crash使用参考
整理自man 8 crash 1.简介 Crash工具可以用来分析一个正在运行的内核,也可以用来分析一个内核的crash dump文件,这里说的是内核代码异常产生的crash dump文件,不是应用层 ...
- ArrayList遍历(JAVA)
假如有个ArrayList变量如下: ArrayList<String> list = new ArrayList<String>(); list.add("arra ...
- 实验吧密码学:RSAROLL
原题: {920139713,19} 704796792 752211152 274704164 18414022 368270835 483295235 263072905 459788476 48 ...
- asp.net mvc4 使用分部视图来刷新数据库
前几天研究SSE,用浏览器做侦听后台数据库数据变化,如果有更新,就即时通过浏览器,使用SSE效果果然OK,侦听数据库有更新时马上会向浏览器通知有新数据,我还在浏览器里放了短音提示,但遇到一个问题,发出 ...
- JQuery UI的拖拽功能实现方法小结
JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念 ...
- BZOJ4735 你的生命已如风中残烛(组合数学)
将每个位置上的数都-1,则显然相当于前缀和始终非负. 然后就是完全想不到的了.考虑往里面加一张-1的牌.假设在一个合法排列的最后添上一个-1,那么在该排列的所有循环同构排列中,满足前m个前缀和都非负的 ...
- POJ3468:A Simple Problem with Integers——题解
http://poj.org/problem?id=3468 实现一个线段树,能够做到区间修改和区间查询和. 明显板子题. #include<cstdio> #include<cma ...
- BZOJ4945 & 洛谷3825 & UOJ317:[NOI2017]游戏——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4945 https://www.luogu.org/problemnew/show/P3825 ht ...
- 20165218 2017-2018-1《Java程序设计》第二周学习总结
20165218 2017-2018-1 <Java程序设计>第2周学习总结 教材学习内容总结 Ch2 基本数据类型与数组 Unicode字符集之中所有都叫做"字母", ...
- HDOJ(HDU).1015 Safecracker (DFS)
HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1 ...