博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu6040
阅读量:5937 次
发布时间:2019-06-19

本文共 1642 字,大约阅读时间需要 5 分钟。

题意

将一个函数运行 n 次,一共得到 n 个值,有 m 次询问,每次询问第 k 小的值。

分析

考察了 \(nth\_element\) 函数的运用。\(nth\_element(a, a + x, a + n)\) 使得 ( \(a\) 数组下标范围 \([0, n)\)\(a[x]\) 存的是第 \(x\) 小的数,且保证 \(x\) 左边的数小于等于它,右边的数大于等于它( 当 \(x = 0\) 时, \(a[0]\) 是最小的值 )。

\(k\) 排序后从大到小,求值,并更新 \(n\) 的值,因为右边的数一定大于等于左边的数,剩下第 k 小的取值一定能在左边取到。

code

#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int MAXN = 1e7 + 10;int kase = 1;int n, m;unsigned A, B, C;unsigned x, y, z;unsigned rng61() { unsigned t; x ^= x << 16; x ^= x >> 5; x ^= x << 1; t = x; x = y; y = z; z = t ^ x ^ y; return z;}unsigned a[MAXN];struct B { int x, i; bool operator<(const B&other) const { return x > other.x; }}b[105];unsigned ans[105];int main() { while(~scanf("%d%d%u%u%u", &n, &m, &A, &B, &C)) { x = A; y = B; z = C; for(int i = 0; i < n; i++) { a[i] = rng61(); } for(int i = 0; i < m; i++) { scanf("%d", &b[i].x); b[i].i = i; } sort(b, b + m); int len = n; for(int j = 0; j < m; j++) { if(j && b[j].x == b[j - 1].x) { ans[b[j].i] = ans[b[j - 1].i]; continue; } nth_element(a, a + b[j].x, a + len); ans[b[j].i] = a[b[j].x]; len = b[j].x; } printf("Case #%d:", kase++); for(int i = 0; i < m; i++) { printf(" %u", ans[i]); } printf("\n"); } return 0;}

转载于:https://www.cnblogs.com/ftae/p/7242288.html

你可能感兴趣的文章
linux下编译httpd程序
查看>>
Linux学习感悟及目标制定
查看>>
常用命令2
查看>>
蓝绿发布、滚动发布、灰度发布等部署方案对比与总结
查看>>
Linux Debian8 Rsync+Sersync实现数据实时同步
查看>>
学习五十一
查看>>
面向对象的三个基本特征
查看>>
docker容器中没有vi
查看>>
python wxpython制作计算器
查看>>
Photoshop修复画笔工具、污点修复画笔工具使用方法
查看>>
DNS服务之反向解析
查看>>
SSL虚拟主机
查看>>
Java基础——过滤器和监听器
查看>>
公司要安装电脑监控软件你同意吗?
查看>>
MySQL 5.7 操作命令
查看>>
day 20 第一阶段考试总结
查看>>
day34 awk数组
查看>>
SQL内连接、外连接以及(+)号用法
查看>>
equals与==的区别
查看>>
mysql主从配置实现一主一从读写分离
查看>>