题意略。

思路:题目就是在询问你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的更多相关文章

  1. 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) ,对于每个询 ...

  2. HDU 6040 Hints of sd0061(划分高低位查找)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ...

  3. HDU 6040 Hints of sd0061(nth_element)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6040 [题目大意] 给出一个随机数生成器,有m个询问,问第bi小的元素是啥 询问中对于bi< ...

  4. 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 ...

  5. HDU 6040 stl

    Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  6. HDU 6040 Hints of sd0061 nth_element函数

    Hints of sd0061 Problem Description sd0061, the legend of Beihang University ACM-ICPC Team, retired ...

  7. 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 ...

  8. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

随机推荐

  1. ASP.NET Core 中的管道机制

    首先,很感谢在上篇文章 C# 管道式编程 中给我有小额捐助和点赞的朋友们,感谢你们的支持与肯定.希望我的每一次分享都能让彼此获得一些收获,当然如果我有些地方叙述的不正确或不当,还请不客气的指出.好了, ...

  2. eclipse(javaee windows)

    百度云:链接:http://pan.baidu.com/s/1eSoO4s6   密码:54am 官方下载网址:http://www.eclipse.org/downloads/eclipse-pac ...

  3. 初探java流操作

    在处理集合时,我们通常会迭代遍历它的元素,并从每个元素上执行某项操作.例如,假设我们想要对某本书中的所有长单词进行计数.首先我们要将所有单词放入一个列表中: String contents = new ...

  4. [算法]LeetCode 1.两数之和

    LeetCode 1.两数之和(python) 1.朴素解法 最朴素的两个for循环大法: class Solution: def twoSum(self, nums: List[int], targ ...

  5. TestNG中DataProvider的用法二:简单的数据驱动

    @DataProvider标记的方法除了可以返回数组外,还可以返回一个Iterator,这样的好处是不用把所有的测试数据都加载到内存中,而是需要的时候就读一条. 下面的例子就使用了Iterator,然 ...

  6. python 简单的实现文件内容去重

    文件去重 这里主要用的是set()函数,特别地,set中的元素是无序的,并且重复元素在set中自动被过滤. 测试文本为 data.txt 具体代码如下: // 文件去重 #!/usr/bin/env ...

  7. 浅谈 ASCII、Unicode、UTF-8,一目了然

    对于ASCII.Unicode.UTF-8这三种编码方式我们经常用到,也经常挂到嘴边,但他们是怎么来的,为什么要存在,具体是怎么个规则,我们并没有做深入了解,下面,就带你看一下他们到底是怎么回事吧…… ...

  8. 优雅的对象转换解决方案-MapStruct及其入门(一)

    第一次看到 MapStruct 的时候, 我个人非常的开心. 因为其跟我内心里面的想法不谋而合. 1 MapStruct 是什么? 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的 ...

  9. 1、大型项目的接口自动化实践记录--robotframework环境搭建

    因为人力.团队技术问题,选用robotframework来做自动化,首先说下环境搭建 齐涛道长的入门教程非常棒:http://blog.csdn.net/tulituqi/article/detail ...

  10. Linux学习之自动配置部署——初用expect

    主机A连接主机B 免密登陆 + 自动部署 expect实现自动的交互式任务 ——— send 向进程发送字符串(输入) ——— expect 从进程接受字符串 ——— spawn 启动新进程 ——— ...