HDU 6040
题意略。
思路:题目就是在询问你m次,第k小是哪个数。首先我们可以想到直接排序后,即可O(1)来查找询问。但是题目中n的范围给的是1e7,
无法承受nlogn的复杂度。从而想到另外一种求静态第k小的方法:利用快速排序来做到。时间复杂度是O(n),但是询问次数m是100,
同样无法承受O(n * m)的复杂度。这时我们应该想到题目中给的另外一个条件:if (bi < bk && bj < bk && bi != bk) then bi + bj <= bk。
从而我们知道了询问次数最坏的情况下bi数列应该是一个斐波那契数列,而斐波那契数列有一个重要性质:b[n] / b[n+1] = 0.618。如果
我们倒着来求这些询问的答案,那么后一个结果就可以利用上前一个结果来缩短自己的划分范围。我们知道第一个结果的求解复杂度是
O(n)的,那么总的复杂度是:n * (1 + 0.618 + 0.618^2 + 0.618^3 +......) = O(n)。
详见代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e7 + ; struct query{
int bi,id;
unsigned ans;
}; unsigned store[maxn];
query depot[];
int n,m,cas = ;
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;
}
bool cmp(const query& a,const query& b){
return a.id < b.id;
}
bool cmp2(const query& a,const query& b){
return a.bi < b.bi;
} int main(){
while(scanf("%d%d%u%u%u",&n,&m,&x,&y,&z) == ){
for(int i = ;i < m;++i){
scanf("%d",&depot[i].bi);
depot[i].id = i;
}
for(int i = ;i < n;++i){
store[i] = rng61();
}
sort(depot,depot + m,cmp2);
int bound = n;
for(int i = m - ;i >= ;--i){
nth_element(store,store + depot[i].bi,store + bound);
depot[i].ans = store[depot[i].bi];
bound = depot[i].bi;
}
sort(depot,depot + m,cmp);
printf("Case #%d:",cas++);
for(int i = ;i < m;++i){
printf(" %u",depot[i].ans);
}
printf("\n");
}
return ;
}
HDU 6040的更多相关文章
- HDU 6040 - Hints of sd0061   |  2017 Multi-University Training Contest 1
		/* HDU 6040 - Hints of sd0061 [ 第k小数查询,剪枝 ] 题意: 给出随机数列 a[N] (N < 1e7) 询问 b[M] (M < 100) ,对于每个询 ... 
- HDU 6040 Hints of sd0061(划分高低位查找)
		[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ... 
- HDU 6040 Hints of sd0061(nth_element)
		[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ... 
- hdu 6040 Hints of sd0061(stl:   nth_element(arr,arr+k,arr+n))
		Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ... 
- HDU 6040 stl
		Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ... 
- HDU 6040 Hints of sd0061   nth_element函数
		Hints of sd0061 Problem Description sd0061, the legend of Beihang University ACM-ICPC Team, retired ... 
- HDU 6040 Hints of sd0061 —— 2017 Multi-University Training 1
		Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ... 
- HDOJ 2111. Saving HDU 贪心 结构体排序
		Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ... 
- 【HDU 3037】Saving Beans Lucas定理模板
		http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ... 
随机推荐
- C# 一句很简单而又很经典的代码
			一.知识点 二.问题 如果以上四个问题,你很自信,那么以下,您就不要看了,因为我想说的东西真的很简单. 如果你开始怀疑自己,可以继续向下看.你自己到底真的理解吗??? 再看下面这段代码有没有问题? c ... 
- java练习---4
			//程序员:罗元昊 2017.9.17 今天好累吖咦吖咦吖 package demo;import java.util.Scanner;public class Lk { public static ... 
- 执行shell脚本的四种方式
			这篇文章主要介绍了Linux中执行shell脚本的4种方法,即总结在Linux中运行shell脚本的4种方法. 前提:bash shell 脚本的方法有多种,假设我们编写好的shell脚本的文件名为h ... 
- Windows 使用 helm3 和 kubectl
			简介: 主要原因是,我不会 vim ,在 linux 上修改 charts 的很蹩脚,所以就想着能不能再 windows 上执行 helm 命令,将 charts install linux 上搭建的 ... 
- Waiting for 1 instance(s) to be deallocated
			看是不是马虎,自己的xampp,也就是mysql有没有打开 
- mysql 学习第一天
			RDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语: 数据库: 数据库是一些关联表的集合. 数据表: 表是数据的矩阵.在一个数据库中的表看起来像一个简单的电子表格 ... 
- HackBar收费版绕过
			一段时间没用HackBar,近期做渗透,打开火狐浏览器,按F12键调出HackBar,发现居然需要收费买license才能使用. 经过研究,整理了以下两个绕过HackBar收费版的方法. 第一种:用其 ... 
- 对数变换(一些基本的灰度变换函数)基本原理及Python实现
			1. 基本原理 变换形式如下 $$T(r) = c\lg(r+1)$$ c为常数 由于对数函数的导数随自变量的增大而减小,对数变换将输入窄范围的低灰度值扩展为范围宽的灰度值和宽范围的高灰度值压缩为映射 ... 
- AQS之CountDownLatch、Semaphore、CyclicBarrier
			CountDownLatch A synchronization aid that allows one or more threads to wait until a set of operatio ... 
- Django中自定义admin---Xadmin的实现
			在Django框架中,自带一个后台管理页面admin,这个管理页面很全,但是,有些并不是我们需要的,所以我们可以根据admin的实现流程来自定义自己的需求,即根据admin的实现方式来实现自定制--X ... 
