#include <iostream>
#include <climits>
#include <array>
#include <set>
using std::cin, std::cout;
//!!! 500'007
const int MAX_N = 500'007;
const char endl = '\n';
int main()
{
std::ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, parts;
cin >> n >> parts;
std::array<int, MAX_N> maxBefore;
std::array<int, MAX_N> inputNums;
int prevmin = INT_MAX;
int min = INT_MAX;
int max = -INT_MAX;
int minindex, maxindex;
for (int i = 1; i <= n; i++)
{
int num; cin >> num;
inputNums[i]=num;
if (num >= max)
{
max = num;
maxindex = i;
}
if (num <= min)
{
min = num;
minindex = i;
}
maxBefore[i] = maxindex;
}
int cutoffIndex = n;
int leftSurIndex;
int rightSurIndex;
while (true)
{
if (maxBefore[cutoffIndex] == cutoffIndex)
{
cutoffIndex--;
}
else
{
//finish
leftSurIndex = maxBefore[cutoffIndex]-1;
rightSurIndex = maxBefore[cutoffIndex];
if (cutoffIndex == minindex) //last == min
{
leftSurIndex = minindex-1;
rightSurIndex = minindex;
}
break;
}
}
if (leftSurIndex < 1 || leftSurIndex >= n) leftSurIndex = -1;
if (rightSurIndex < 1 || rightSurIndex >= n) rightSurIndex = -1;
if (cutoffIndex < 1 || cutoffIndex >= n) cutoffIndex = -1;
std::set<int> splitIndices = {-1, leftSurIndex, rightSurIndex, cutoffIndex};
int unusedSplits = parts - splitIndices.size();
if (splitIndices.size() <= parts)
{
cout << "TAK" << endl;
//fill unused splits
for (int i = 1; i < n; i++)
{
if (splitIndices.count(i) == 1)
{
cout << i << ' ';
}
else if (unusedSplits > 0)
{
unusedSplits--;
cout << i << ' ';
}
}
}
else
{
cout << "NIE";
}
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | #include <iostream> #include <climits> #include <array> #include <set> using std::cin, std::cout; //!!! 500'007 const int MAX_N = 500'007; const char endl = '\n'; int main() { std::ios_base::sync_with_stdio(false); cin.tie(NULL); int n, parts; cin >> n >> parts; std::array<int, MAX_N> maxBefore; std::array<int, MAX_N> inputNums; int prevmin = INT_MAX; int min = INT_MAX; int max = -INT_MAX; int minindex, maxindex; for (int i = 1; i <= n; i++) { int num; cin >> num; inputNums[i]=num; if (num >= max) { max = num; maxindex = i; } if (num <= min) { min = num; minindex = i; } maxBefore[i] = maxindex; } int cutoffIndex = n; int leftSurIndex; int rightSurIndex; while (true) { if (maxBefore[cutoffIndex] == cutoffIndex) { cutoffIndex--; } else { //finish leftSurIndex = maxBefore[cutoffIndex]-1; rightSurIndex = maxBefore[cutoffIndex]; if (cutoffIndex == minindex) //last == min { leftSurIndex = minindex-1; rightSurIndex = minindex; } break; } } if (leftSurIndex < 1 || leftSurIndex >= n) leftSurIndex = -1; if (rightSurIndex < 1 || rightSurIndex >= n) rightSurIndex = -1; if (cutoffIndex < 1 || cutoffIndex >= n) cutoffIndex = -1; std::set<int> splitIndices = {-1, leftSurIndex, rightSurIndex, cutoffIndex}; int unusedSplits = parts - splitIndices.size(); if (splitIndices.size() <= parts) { cout << "TAK" << endl; //fill unused splits for (int i = 1; i < n; i++) { if (splitIndices.count(i) == 1) { cout << i << ' '; } else if (unusedSplits > 0) { unusedSplits--; cout << i << ' '; } } } else { cout << "NIE"; } return 0; } |
English