版权声明:有错误欢迎大家指出。转载请注明出处~ https://blog.csdn.net/black_miracle/article/details/76474330
Hints of sd0061
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2301 Accepted Submission(s): 689
Problem Description
sd0061, the legend of Beihang University ACM-ICPC Team, retired last year leaving a group of noobs. Noobs have no idea how to deal with
m coming contests.
sd0061 has left a set of hints for them.
There are n noobs in the team, the i-th of which has a rating ai. sd0061 prepares one hint for each contest. The hint for the j bj, which means that the noob with the (bj+1)-th lowest rating is ordained by sd0061 for the j-th contest.
The coach asks constroy to make a list of contestants. constroy looks into these hints and finds out: bi+bj≤bk is satisfied if bi≠bj, bi<bk and bj<bk.
Now, you are in charge of making the list for constroy.
There are n noobs in the team, the i-th of which has a rating ai. sd0061 prepares one hint for each contest. The hint for the j bj, which means that the noob with the (bj+1)-th lowest rating is ordained by sd0061 for the j-th contest.
The coach asks constroy to make a list of contestants. constroy looks into these hints and finds out: bi+bj≤bk is satisfied if bi≠bj, bi<bk and bj<bk.
Now, you are in charge of making the list for constroy.
Input
There are multiple test cases (about
10).
For each test case:
The first line contains five integers n,m,A,B,C. (1≤n≤107,1≤m≤100)
The second line contains m integers, the i-th of which is the number bi of the i-th hint. (0≤bi<n)
The n noobs' ratings are obtained by calling following function n times, the i-th result of which is ai.
For each test case:
The first line contains five integers n,m,A,B,C. (1≤n≤107,1≤m≤100)
The second line contains m integers, the i-th of which is the number bi of the i-th hint. (0≤bi<n)
The n noobs' ratings are obtained by calling following function n times, the i-th result of which is ai.
unsigned x = A, y = B, z = C; 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; }
Output
For each test case, output "
Case #x: y1 y2 ⋯ ym" in one line (without quotes), where
x indicates the case number starting from
1 and
yi
(1≤i≤m) denotes the rating of noob for the
i-th contest of corresponding case.
Sample Input
3 3 1 1 1 0 1 2 2 2 2 2 2 1 1
Sample Output
Case #1: 1 1 202755 Case #2: 405510 405510
题意:算n次那个函数得到a数组 每次询问第b[i]大的
题解:预处理后对b数组排序然后用nth_element()就好了
因为bi+bj<=bk
所以下降速度很快
注意nth_element()第二个参数是n-1 n是第n大的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
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[10000007],ans[105];
int b[105],pos[105];
bool cmp(int i,int j){
return b[i]<b[j];
}
int main(){
int cas=1,i;
unsigned A,B,C;
int n,m;
while(scanf("%d%d%u%u%u",&n,&m,&A,&B,&C)!=EOF){
x=A;
y=B;
z=C;
for(i=1;i<=m;i++){
scanf("%d",&b[i]);
// b[i]++;
pos[i]=i;
}
sort(pos+1,pos+1+m,cmp);
for(i=1;i<=n;i++)a[i]=rng61();
b[m+1]=n;
pos[m+1]=m+1;
printf("Case #%d:",cas++);
for(i=m;i>=1;i--){
nth_element(a+1,a+1+b[pos[i]],a+1+b[pos[i+1]]);
ans[pos[i]]=a[b[pos[i]]+1];
}
for(i=1;i<=m;i++)cout<<" "<<ans[i];
printf("\n");
}
return 0;
}