# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
16907 | erdemkiraz | 등산 경로 (IZhO12_route) | C++98 | 191 ms | 42240 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define type(x) __typeof((x).begin())
#define foreach(it, x) for(type(x) it = (x).begin(); it != (x).end(); it++)
#define end ____end
typedef long long ll;
typedef pair < int, int > ii;
const int inf = 1e9 + 333;
const ll linf = 1e18 + inf;
const int N = 2e6 + 5;
int n, k, ans;
int a[N], root[N], beg[N], end[N], val[N];
int f(int x) {
if(x == root[x])
return x;
return root[x] = f(root[x]);
}
void merge(int x, int y) {
x = f(x);
y = f(y);
if(val[x] != val[y])
return;
root[y] = x;
beg[x] = min(beg[x], beg[y]);
end[x] = max(end[x], end[y]);
}
int main() {
scanf("%d %d", &n, &k);
for(int i = 0; i < n; i++) {
scanf("%d", a + i);
}
int ind = max_element(a, a + n) - a;
for(int i = 0; i < ind; i++)
a[i + n] = a[i];
for(int i = 0; i < n; i++)
a[i] = a[i + ind];
assert(max_element(a, a + n) == a);
set < ii > s;
val[0] = a[0];
root[n] = 0;
for(int i = 1; i < n; i++) {
int j = i;
while(j + 1 < n and a[j + 1] == a[i])
j++;
for(int k = i; k <= j; k++)
root[k] = i;
val[i] = a[i];
beg[i] = i;
end[i] = j;
int l = i - 1;
int r = (i + 1) % n;
if(a[i] < a[l] and a[i] < a[r]) {
s.insert(ii(j - i + 1, i));
}
i = j;
}
while(s.size()) {
int len = s.begin() -> first;
if(k < len)
break;
int x = s.begin() -> second;
s.erase(s.begin());
int i = beg[x];
int j = end[x];
int l = val[f(i - 1)];
int r = val[f(j + 1)];
int p = min(k / len, min(l, r) - val[x]);
assert(p);
k -= p * len;
ans += p * 2;
val[x] += p;
if(i - 1 > 0) {
merge(x, i - 1);
}
if(j + 1 < n) {
merge(x, j + 1);
}
i = beg[x];
j = end[x];
l = val[f(i - 1)];
r = val[f(j + 1)];
if(val[x] < l and val[x] < r) {
s.insert(ii(j - i + 1, x));
}
}
printf("%d\n", ans);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |