(2017多校训练第一场)HDU - 6040 Hints of sd0061 nth_element函数

本文提供了一个竞赛编程示例,使用C++实现了一种基于随机数生成和排序算法的问题解决策略。该示例包括了自定义结构体、比较运算符重载、快速选择算法等关键编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方题解:


代码如下:

#include <bits/stdc++.h>

using namespace std;

typedef long long int LL;
const int MOD = 998244353;
const int MAX_N = 105;
const int INF = 0x3f3f3f3f;
struct Node
{
    int val;
    int pos;
    bool operator < (const Node& a) const
    {
        return val < a.val || (val == a.val && pos < a.pos);
    }
};
Node b[MAX_N];
unsigned a[10000005];
unsigned ans[MAX_N];
unsigned n, m, 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;
}

int main()
{
    //freopen("test.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    cin.sync_with_stdio(false);
    int Case = 1;
    while (cin >> n >> m >> x >> y >> z)
    {
        for (int i=1; i<=m; i++)
        {
            cin >> b[i].val;
            b[i].val++;
            b[i].pos = i;
        }
        b[m + 1].val = n + 1;
        sort(b + 1, b + m + 1);
        for (int i=1; i<=n; i++)
            a[i] = rng61();
        for (int i=m; i>=1; i--)
        {
            nth_element(a + 1, a + b[i].val, a + b[i + 1].val);
            ans[b[i].pos] = a[b[i].val];
        }
        cout << "Case #" << Case++ << ":";
        for (int i=1; i<=m; i++)
            cout << ' ' << ans[i];
        cout << endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值