constint N = 1e5 + 5; int n, a[N]; void _main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; int res = a[1]; for (int i = 2; i <= n; i++) res += max(0, a[i] - a[i - 1]); cout << res; }
:::
变式
给你长度为 n 的数组 a。一次操作将一个子区间上所有元素减 1,或者将下标为奇数 / 偶数的元素减 1。
void _main() { cin >> n; a[n + 1] = 0; for (int i = 1; i <= n; i++) cin >> a[i]; longlong res = 0, x = 0, y = 0, nxt = 0, z = 0; for (int i = 1; i <= n; i++) { int d = x + y - a[i + 1]; if (d > 0) { if (x < d) y += x - d, d = x; if (y < d) x += y - d, d = y; x -= d, y -= d, a[i + 1] -= d, z = d; } a[i + 1] -= x + y, res += a[i]; int h = min(a[i], a[i + 1]); x += h, a[i] -= h, a[i + 1] -= h, nxt += a[i]; a[i + 1] += z, res -= z, z = 0, swap(y, nxt); } cout << res << '\n'; }
constint N = 2e5 + 5; int n, a[N]; void _main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; longlong p = 0; for (int i = 1; i <= n; i++) p += abs(a[i] - a[(i + 1) % n + 1]); cout << max<longlong>(*max_element(a + 1, a + n + 1), p / 2); }
int opt, n, seed, a[N], u[N], v[N]; int tot = 0, head[N]; structEdge { int next, to; } edge[N << 1]; inlinevoidadd_edge(int u, int v){ edge[++tot].next = head[u], edge[tot].to = v, head[u] = tot; } longlong ans; longlongdfs(int u, int fa){ longlong s = 0, m = 0; for (int j = head[u]; j != 0; j = edge[j].next) { int v = edge[j].to; if (v == fa) continue; longlong x = dfs(v, u); s += x, m = max(m, x); } longlong l = max(0LL, min({1LL * a[u], s - a[u], s / 2, s - m})); ans += max(0LL, a[u] - s + l) - l; return a[u] - l; }
void _main() { cin >> opt; if (opt == 1) { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i < n; i++) cin >> u[0] >> v[0], add_edge(u[0], v[0]), add_edge(v[0], u[0]); } else { cin >> seed >> n; Generate::n = n, Generate::seed = seed, Generate::RS(a, u, v); for (int i = 1; i < n; i++) add_edge(u[i], v[i]), add_edge(v[i], u[i]); } dfs(1, -1); cout << ans; }