HDU 6040 Hints of sd0061 (nth_element()函数介绍)

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=6040
一、函数参数

nth_element(first, nth, last, compare)

nth_element(array, array+6, array+len); //排序了array[6]这个位置,其实是第7小

求[first, last]这个区间中第n大小的元素,如果参数加入了compare函数,就按compare函数的方式比较。

二.作用
nth_element仅排序第n个元素(从0开始索引),即将位置n(从0开始)的元素放在第n大的位置,处理完之后,默认排在它前面的元素都不比它大,排在它后面的元素都不比它小。

例如:array[first, last)元素区间,排序后,array[nth]就是第n大的元素(从0开始)
但是[first, nth) 和 [nth,last)区间的大小顺序不一定。但是可以确定的是array[nth]一定是整个区间里第n大的元素。

[first,nth)中的元素都是不大于array[nth]的,[nth, last)中的元素都是不小于array[nth]的。


#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e7 + 5;

struct node {
    int k, id;
    bool operator<(const node& A)const {
        return k < A.k;
    }
} B[105];
unsigned A[maxn];
int n, m, cas = 0;
unsigned x, y, z, a, b, c, ans[105];

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;
}
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 < m; i++) scanf("%d", &B[i].k), B[i].id = i;
        for (int i = 0; i < n; i++) A[i] = rng61();
        sort(B, B + m);
        B[m].id = m;
        B[m].k = n;
        //从大到小开始计算,可以缩小计算量
        for (int i = m - 1; i >= 0; i--) {
            nth_element(A, A + B[i].k, A + B[i + 1].k);
            //A数组,排序第B[i].k个(从0开始,其实是第B[i].k+1小,即排序了A[B[i].k]这一个位置)
            //第nth小(从0开始,其实n+1)
            ans[B[i].id] = A[B[i].k];
        }
        printf("Case #%d:", ++cas);
        for (int i = 0; i < m; i++) printf(" %u", ans[i]);
        printf("\n");
    }
    return 0;
}
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页

打赏作者

yiqzq

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值