//============================================================================ // Name : 4c-ran.cpp //============================================================================ #include <iostream> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); vector<int> seq; int n, maxIdx = -1; { int num; cin >> n; for (int i = 0; i < n; i++) { cin >> num; seq.push_back(num); if (num == n) { maxIdx = i; } } } vector<int> leftLimits; vector<int> rightLimits; { int prevMax = -1; for (int i = 0; i < maxIdx; i++) { if (seq[i] > prevMax) { prevMax = seq[i]; } leftLimits.push_back(prevMax); } leftLimits.push_back(n); prevMax = -1; for (int i = n - 1; i > maxIdx; i--) { if (seq[i] > prevMax) { prevMax = seq[i]; } rightLimits.push_back(prevMax); } rightLimits.push_back(n); } int result = 1; { int maxValue = 0, leftIndent = 0, rightIndent = 0; for (int i = 1; i < n; i++) { maxValue = (n + i - 1) / 2; for (unsigned int li = leftIndent; li < leftLimits.size(); li++) { leftIndent = li; if (leftLimits[li] > maxValue) { break; } } for (unsigned int ri = rightIndent; ri < rightLimits.size(); ri++) { rightIndent = ri; if (rightLimits[ri] > maxValue) { break; } } int width = min(i, leftIndent) + min(i, rightIndent); if (width >= i) { result += width - i + 1; } } } cout << 2 * n + 1 << " " << result << endl; 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 | //============================================================================ // Name : 4c-ran.cpp //============================================================================ #include <iostream> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); vector<int> seq; int n, maxIdx = -1; { int num; cin >> n; for (int i = 0; i < n; i++) { cin >> num; seq.push_back(num); if (num == n) { maxIdx = i; } } } vector<int> leftLimits; vector<int> rightLimits; { int prevMax = -1; for (int i = 0; i < maxIdx; i++) { if (seq[i] > prevMax) { prevMax = seq[i]; } leftLimits.push_back(prevMax); } leftLimits.push_back(n); prevMax = -1; for (int i = n - 1; i > maxIdx; i--) { if (seq[i] > prevMax) { prevMax = seq[i]; } rightLimits.push_back(prevMax); } rightLimits.push_back(n); } int result = 1; { int maxValue = 0, leftIndent = 0, rightIndent = 0; for (int i = 1; i < n; i++) { maxValue = (n + i - 1) / 2; for (unsigned int li = leftIndent; li < leftLimits.size(); li++) { leftIndent = li; if (leftLimits[li] > maxValue) { break; } } for (unsigned int ri = rightIndent; ri < rightLimits.size(); ri++) { rightIndent = ri; if (rightLimits[ri] > maxValue) { break; } } int width = min(i, leftIndent) + min(i, rightIndent); if (width >= i) { result += width - i + 1; } } } cout << 2 * n + 1 << " " << result << endl; return 0; } |