Областная олимпиада по информатике, 2018 год, 9-10-11 классы


(k-сыншы жұп) Сізге $n$ бүтін $a_1$, $a_2$, ..., $a_n$ сандардан тұратын $a$ массиві берілген.
Массивтің $(i, j)$ $1 \le i < j \le n$ индекстері арқылы $a_i$, $a_j$ жұбын ала аламыз және ол жұптың күші $a_i + a_j$ болады. Берілген массивтегі алуға болатын жұптардың барлығын күші бойынша \textbf{кемімейтін} ретпен сұрыптаған кездегі $k$-сыншы орындағы жұптың күшінің мәнін табыңыз.
Кіріс деректер форматы:
Бірінші қатарда екі $n$ және $k$ ($1 \le k \le \frac{n * (n - 1)}{2}$) сандары берілген.
Екінші қатарда бос орын арқылы $a_1$, $a_2$, ..., $a_n$ ($0 \le a_i \le 10^6$) бүтін сандары берілген.
Шығыс деректер форматы:
Есептің жауабын шығарыңыз.
Мысалдар:
1.Мысал:
3 3
7 1 4
Жауап:
11
2.Мысал:
5 7
1 5 3 5 3
Жауап:
8
3.Мысал:
10 32
0 0 0 0 0 0 0 0 0 0
Жауап:
0
4.Мысал:
9 15
5 6 3 0 0 4 1 4 1
Жауап:
5
Түсініктеме:
Бірінші мысалда күштері {$a_1$ + $a_2$, $a_1$ + $a_3$, $a_2$ + $a_3$} = {7 + 1, 7 + 4, 1 + 4} = {8, 11, 5} болатын үш жұп алуға болады. Егер оларды күші бойынша кемімейтін ретпен сұрыптасақ, онда олар {5, 8, 11} ретпен тұрады және осындағы 3-шісі 11-ге тең.
Екінші мысалда күштері {$a_1$ + $a_2$, $a_1$ + $a_3$, $a_1$ + $a_4$, $a_1$ + $a_5$, $a_2$ + $a_3$, $a_2$ + $a_4$, $a_2$ + $a_5$, $a_3$ + $a_4$, $a_3$ + $a_5$, $a_4$ + $a_5$} = {1 + 5, 1 + 3, 1 + 5, 1 + 3, 5 + 3, 5 + 5, 5 + 3, 3 + 5, 3 + 3, 5 + 3} = {6, 4, 6, 4, 8, 10, 8, 8, 6, 8} болатын он жұп алуға болады. Егер оларды күші бойынша кемімейтін ретпен сұрыптасақ, онда олар {4, 4, 6, 6, 6, 8, 8, 8, 8, 10} ретпен тұрады және осындағы 7-шісі 8-ге тең.
Бағалау:
Есеп 50 тесттен тұрады, әр тест 2 ұпаіға бағаланады.
Тесттердегі шектеулер:
( Yeskendir Sultanov )
посмотреть в олимпиаде

Комментарий/решение:

пред. Правка 2   -2
2020-01-01 20:56:53.0 #

кодты корсету/жасыру

пред. Правка 2   -1
2021-02-01 15:54:07.0 #

[deleted.]

пред. Правка 2   1
2019-01-02 22:27:21.0 #

  0
2019-11-12 16:58:48.0 #

//TLE 26 test

кодты корсету/жасыру

  0
2019-11-12 23:02:41.0 #

попробуйте использовать scanf и не используйте vector а простой массив

пред. Правка 5   0
2021-02-01 15:55:13.0 #

[deleted.]

пред. Правка 3   -1
2021-02-01 15:55:00.0 #

[deleted.]

пред. Правка 3   0
2021-02-01 15:54:40.0 #

[deleted.]

  0
2020-01-01 21:06:10.0 #

Нет такое решение не пройдет.

Полное решение предполагает использование бинпоиска по ответу.

Отсортируем числа. Для конкретной суммы C посчитаем сколько таких, что $a_i + a_j < C$. это делается за линию.

Если переберем С бинпоиском получим асимптотику  $N * log(max(2 * a_i))$

пред. Правка 2   0
2021-02-01 15:54:50.0 #

[deleted.]

  0
2020-01-02 13:53:38.0 #

кодты корсету/жасыру

  0
2022-01-09 12:12:50.0 #

кодты корсету/жасыру

  0
2022-02-20 12:00:38.0 #

На питоне

кодты корсету/жасыру

  0
2024-12-28 10:24:06.0 #

=#include <bits/stdc++.h>

using namespace std;

signed main(){

ios_base::sync_with_stdio(false);

cin.tie(0);

int n , k;

cin >> n >> k;

priority_queue<int>st;

vector<int>a(n);

for(int i = 0; i < n; ++i)cin >> a[i];

sort(a.begin() , a.end());

for(int i = 0; i < min(80000 , n); ++i){

for(int j = i + 1; j <= min(i + 350 , n - 1); ++j){

if(st.size() < k){

st.push(a[i] + a[j]);

}

else{

if(a[i] + a[j] < st.top()){

st.pop();

st.push(a[i] + a[j]);

}

}

}

}

cout << st.top();

}кодты корсету/жасыру