/*
* author: pavveu
* task: WIN[B]
* time: O(n log n)
* solution: coordinates change + sorting
*/
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
using vi = vector<int>;
#define all(x) begin(x), end(x)
void go() {
int n, k; cin >> n >> k;
// wines = { year, bottles_above }
// bottles above means how many bottles we have to
// take including this one, to piramid remain stable
vector<pii> wines ((n * (n + 1))/2, {0,0});
vector<vi> coords (n + 1, vi(n + 1, -1));
// index i means i-th bottle that has been read
int index = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
coords[i][j] = index;
cin >> wines[index].first;
index++;
}
}
// transfer from i-th index to coordinates (row, col)
// row col
// 0 0
// 1 x 1
// 2 x x 2
// x x x
//
// if we know (row, col) coordinates, we can simply
// find answer for earch bottles, because is (row + 1)*(col + 1)
// because we must take off piramid every right and left parent
// recursively, so it gives us rectangle of (rows + 1)*(cols + 1) field
for (int i = 1; i <= n; i++ ) {
int j = 1;
while ( (i + j - 1) <= n && coords[i + j - 1][j] != -1) {
int wineIndex = coords[i + j - 1][j];
wines[wineIndex].second = i * j;
j++;
}
}
// sort by year
sort(all(wines), [&](const pii & a, const pii & b){
if ( a.first == b.first ) return a.second < b.second;
else return a.first < b.first;
});
// find smallest year with obtainable steps
int ans = -1;
for ( const pii & wine : wines ) {
int year = wine.first;
int above = wine.second;
// cout << "(y: " << year << ", a: " << above << ")\n";
if ( above <= k ) { ans = year; break; }
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
go();
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | /* * author: pavveu * task: WIN[B] * time: O(n log n) * solution: coordinates change + sorting */ #include <bits/stdc++.h> using namespace std; using pii = pair<int,int>; using vi = vector<int>; #define all(x) begin(x), end(x) void go() { int n, k; cin >> n >> k; // wines = { year, bottles_above } // bottles above means how many bottles we have to // take including this one, to piramid remain stable vector<pii> wines ((n * (n + 1))/2, {0,0}); vector<vi> coords (n + 1, vi(n + 1, -1)); // index i means i-th bottle that has been read int index = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { coords[i][j] = index; cin >> wines[index].first; index++; } } // transfer from i-th index to coordinates (row, col) // row col // 0 0 // 1 x 1 // 2 x x 2 // x x x // // if we know (row, col) coordinates, we can simply // find answer for earch bottles, because is (row + 1)*(col + 1) // because we must take off piramid every right and left parent // recursively, so it gives us rectangle of (rows + 1)*(cols + 1) field for (int i = 1; i <= n; i++ ) { int j = 1; while ( (i + j - 1) <= n && coords[i + j - 1][j] != -1) { int wineIndex = coords[i + j - 1][j]; wines[wineIndex].second = i * j; j++; } } // sort by year sort(all(wines), [&](const pii & a, const pii & b){ if ( a.first == b.first ) return a.second < b.second; else return a.first < b.first; }); // find smallest year with obtainable steps int ans = -1; for ( const pii & wine : wines ) { int year = wine.first; int above = wine.second; // cout << "(y: " << year << ", a: " << above << ")\n"; if ( above <= k ) { ans = year; break; } } cout << ans << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(0); go(); return 0; } |
English