2017 Multi-University Training Contest

来源:互联网 发布:java随机数生成 编辑:程序博客网 时间:2024/06/07 06:21

http://acm.hdu.edu.cn/showproblem.php?pid=6040


题意:

给出随机数列 a[N] (N < 1e7);
询问 b[M] (M < 100) ,对于每个询问输出第 b[i]+1小的数字;
满足对任意 i,j,k,若b[i] <= b[k] && b[j] <= b[k] 则一定有 b[i]+b[j] <= b[k];

思路:

比赛的时候并不知道有nth_element这个函数,直到比赛结束后看了一下别人的题解,才知道原来这个库函数可以过这道题。首先对bi进行由小到大排序, 将第K大的元素放在数组的下标K上, 左面全比他小, 右面全比他大,然后从m到0使用nth_element进行查找,找出bi+1大的数。

#include<bits/stdc++.h>using namespace std;unsigned T,m,n,id[110],b[110];unsigned s[10000010],a[110],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;}bool cmp(unsigned x,unsigned y){    return b[x] < b[y];}int main(){    int cas = 1;    while(~scanf("%u %u %u %u %u",&n,&m,&x,&y,&z)){        for(int i = 0;i < m;i++){            id[i] = i;            scanf("%u",&b[i]);        }        for(int i = 0;i < n;i++){            s[i] = rng61();        }        sort(id,id + m,cmp);        b[id[m] = m] = n;        for(int i = m - 1;i >= 0;i--){            nth_element(s,s + b[id[i]],s + b[id[i + 1]]);            a[id[i]] = s[b[id[i]]];        }        printf("Case #%d: ",cas++);        for(int i = 0;i < m - 1;i++){            printf("%u ",a[i]);        }        printf("%u\n",a[m - 1]);    }    return 0;}