294
Se dă un șir a[1], a[2], …, a[n] de numere naturale și un număr natural k.
Cerința
Să se determine cele mai mari k numere din șir.
Date de intrare
Programul citește de la tastatură numerele n, k, A, B, C, D. Șirul de numere se va genera după formulele:
a[1] = Aa[i] = (B * a[i-1] + C) % D, pentrui=2..n
Date de ieșire
Programul va afișa pe ecran, ordonate crescător, cele mai mari k numere din șir.
Restricții și precizări
1 ≤ n ≤ 5.000.0001 ≤ k ≤ min(100.000, n)1 ≤ A, B, C, D ≤ 1.000.000.000
Exemplu
Intrare
10 4 13 23 47 97
Ieșire
55 56 74 96
Explicație
Se obține șirul de numere a = (13, 55, 51, 56, 74, 3, 19, 96, 24, 17). Cele mai mari patru numere sunt 55, 56, 74, 96.
#include <bits/stdc++.h>
using namespace std;
int n, H[100001], k;
long long a, b, c, d;
void push_up(int k){
while(k > 1){
if(H[k] >= H[k / 2])
return ;
else
swap(H[k], H[k / 2]), k /= 2;
}
}
void push_down(int k, int n){
while(2 * k <= n){
int p = 2 * k;
if(p + 1 <= n && H[p + 1] < H[p])
p++;
if(H[k] <= H[p])
return ;
else
swap(H[p], H[k]), k = p;
}
}
int main(){
cin >> n >> k >> a >> b >> c >> d;
H[1] = a;
for(int i = 2; i <= n; ++i){
a = (1ll * a * b + c) % d;
if(i > k){
if(a > H[1])
H[1] = a, push_down(1, k);
}
else
H[i] = a, push_up(i);
}
while(k > 0){
cout << H[1] << ' ';
H[1] = H[k];
k--;
push_down(1, k);
}
return 0;
}
Comentarii