题目链接:https://vjudge.net/problem/HDU-6040

题目大意:

  给出 \(n\) 个数,有 \(m\) 次询问,每次询问这 \(n\) 个数中第 \(k+1\) 大的数是什么。

  另有附加限制:对于 \(n\) 个数中的任意三个数 \(a,b,c\),如果满足 \(a \not= b, a < c, b < c\),则有 \(a + b \le c\).

  \((1 \le n \le 10^{7}, 1 \le m \le 100)\)

解题思路:

  由附加限制不难联想到斐波那契数列,由于 \(F(36) = 14930352\),所以我们不难推测将这 \(m\) 次询问中去重后剩下的不同询问的个数是少于 \(36\) 的。

  在此,还要再介绍一个优秀的函数:nth_element. 其用法是:nth_element\((first, nth, last, compare)\);作用是:将第 \(n\) 大的元素放在位置 \(n\)(从0开始),处理完之后,默认排在它前面的元素都不比它大,排在它后面的元素都不比它小。如果有定义 \(compare()\) 函数的话,大小关系则由 \(compare()\) 定义。时间复杂度是 \(O(n)\).

  于是,一种优秀的做法是:将 \(m\) 个询问排序,去重,然后从大往小处理询问,用 nth_element() 求出区间第 \(k\) 大的数,并且将排在第 \(k\) 大的数后面的数都丢掉。

  最后,这是第 \(1000\) 题。悄悄地,为自己鼓个掌 \(XD\)

AC代码:

 #include <bits/stdc++.h>

 using namespace std;
typedef long long LL;
const LL MOD=1e9+;
const int MAXN=1e7+;
const int LIM=1e6; 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 add,n;
unsigned a[MAXN],ta[MAXN];
struct ask{
int ind,pos;
}b[];
bool cmp(const ask &x,const ask &y){
return x.ind<y.ind;
}
unsigned ans[]; int main(){
// freopen("in.txt","r",stdin);
int m,kase=;
unsigned A,B,C;
while(scanf("%d%d%u%u%u",&n,&m,&A,&B,&C)==){
add=;
x=A,y=B,z=C;
for(int i=;i<n;i++)
a[i]=rng61();
for(int i=;i<m;i++){
scanf("%d",&b[i].ind);
b[i].pos=i;
}
sort(b,b+m,cmp);
b[m].pos=m,b[m].ind=n; for(int i=m-;i>=;i--){
if(b[i].ind==b[i+].ind)
ans[b[i].pos]=ans[b[i+].pos];
else{
nth_element(a,a+b[i].ind,a+b[i+].ind);
ans[b[i].pos]=a[b[i].ind];
}
}
printf("Case #%d:",kase++);
for(int i=;i<m;i++) printf(" %u",ans[i]);
printf("\n");
}
return ;
}

HDU6040 Hints of sd0061的更多相关文章

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

  2. Hints of sd0061(快排思想)

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

  3. HDU 6040 Hints of sd0061 nth_element函数

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

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

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

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

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

  7. HDU 6040 Hints of sd0061(nth_element)

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

  8. 随机生成数组函数+nth-element函数

    这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题…… 首先我们先贴一下随机生成数组函数的代码: unsigned x = A, y = B, z = C; u ...

  9. HDU 6040 stl

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

随机推荐

  1. React-Native iOS真机调试(新版)

    2019独角兽企业重金招聘Python工程师标准>>> React-Native iOS真机调试 看到网上很多以前的文章 找到两种方法 一 修改AppDelegate 把URL的替换 ...

  2. JAVA连接Excel最好用的开源项目EasyExcel,官方使用文档及.jar包下载

    EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址:https://github.com/alibaba ...

  3. unittest(生成测试报告)

    1.先导入HTMLTestRunner模块 见上篇HTMLTestRunner模块生成文档 2.实例如下 (1)单用例文件执行且生成报告 import unittest import HTMLTest ...

  4. 07 模型层 orm相关查询 F查询Q查询 django开启事务

    一.Django终端打印SQL语句 如果你想知道你对数据库进行操作时,Django内部到底是怎么执行它的sql语句时可以加下面的配置来查看 在Django项目的settings.py文件中,在最后复制 ...

  5. c++ concurrency

    c++的并发涉及到这么几个东西: std::thread std::mutex std::lock_guard std::lock 参考资料: http://en.cppreference.com/w ...

  6. OSG程序设计之Hello World 4.0

    代码如下: //需要添加两个库:osgUtild.lib.osgTextd.lib #include <osgDB/ReadFile> #include <osgUtil/Optim ...

  7. Spring Cloud学习 之 Spring Cloud Hystrix(流程分析)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 我们还是从流程图入手: 创建HystrixCommand或者HystrixObserv ...

  8. Qt之xml文件解析

    XML文件简介 XML - EXtensible Markup Language,可拓展标记语言 Qt中加载XML模块 .pro 文件中添加 QT += xml Qt的XML访问方式 引用:https ...

  9. JVM垃圾回收器(三)

    垃圾回收知识点 引用计数 给对象添加一个引用计数器,每当一个地方引用这个对象,这个计算器就加1.如果引用失效,那计算器就减1.如果计算器数量为0,那这个对象就是失效的. 但是如果2个对象虽然不用了,但 ...

  10. 【Hadoop离线基础总结】oozie定时任务设置

    目录 简介 概述 oozie定时任务设置 1.拷贝定时任务的调度模板 拷贝hello.sh脚本 3.修改配置文件 4.上传到hdfs对应路径 5.运行定时任务 简介 概述 在oozie当中,主要是通过 ...