HDU6040 Hints of sd0061
题目链接: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的更多相关文章
- 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 ...
- Hints of sd0061(快排思想)
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 Contest 1
/* HDU 6040 - Hints of sd0061 [ 第k小数查询,剪枝 ] 题意: 给出随机数列 a[N] (N < 1e7) 询问 b[M] (M < 100) ,对于每个询 ...
- 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 ...
- 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< ...
- 随机生成数组函数+nth-element函数
这几天做了几道随机生成数组的题,且需要用nth-elemeng函数,并且都是北航出的多校题…… 首先我们先贴一下随机生成数组函数的代码: unsigned x = A, y = B, z = C; u ...
- HDU 6040 stl
Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
随机推荐
- vue与众不同的学习方式,让她年薪200多万
学习vue正确思路,是先学vue-cli,再学vue.js单文件引用的用法,这样会在极短时间内撤底撑握vue,如果先学vue.js单文件用法,再去学vue-cli4,可以说是重新学vue,,,,难处大 ...
- USACO Training Section 1.2 [USACO1.2]回文平方数
题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且 ...
- Centos7增加磁盘空间并挂载目录(VMware)
1.前言 今天本机vmware在使用docker安装oracle11g时提示nospace空间不足,所以用这篇文章简介下虚拟机如何扩展硬盘并挂载 2.添加新硬盘 依次点击"虚拟机" ...
- U盘安装Proxmox VE(二)
转自我的个人博客<U盘安装Proxmox VE(二)> 上一篇<U盘安装Proxmox VE(一)>制作好启动盘后,插入U盘,设置bios从U盘启动,开始安装pve. 一.安装 ...
- centos下的redis一键安装shell脚本
#!/bin/bash yum install cpp binutils glibc-kernheaders glibc-common glibc-devel gcc make wget #安装依赖库 ...
- springboot后端校验
这一篇讲解了如何定义特殊的校验 https://www.cnblogs.com/cjsblog/p/8946768.html https://blog.csdn.net/xgblog/article/ ...
- dp 20190617
A. Alternative Thinking 这个标的是dp,但是我感觉就只能算思维题,不是特别难, 你仔细想想就知道,你先求出01这样子满足条件的个数,如果要进行改变,最多只可以增加两个,也可以增 ...
- Nginx+Uwsgi+Django 项目部署到服务器。
首先先说一下思路: 1.本地django项目打包 主要用到的是 python自带的distutils.core 下的 setup,具体代码在下面,主要讲的两个问题是package主要打包为和目录同级的 ...
- 多线程测试时的辅助类--CountDownLatch
多线程时,很多时候由于mian线程与多线程结束时间不可控,造成无法测试 辅助测试类---CountDownLatch 我看的视频教程匿名内部类无法使用外部的变量,所以CountDownLatch定义为 ...
- [hdu1532]最大流
裸最大流,求最大流一般步骤如下: (1)所有正向边权初始化为容量,反向边权初始化为0 (2)找增广路 (3)找到则进入(4),否则得到最大流并退出 (4) 增广路上所有边减去最小边权,相应的方向边加上 ...