A
int T, n, a[105], dp[105][2];
signed main(void) {
for (read(T); T; T--) {
read(n); int mx = 0, id = 0;
for (int i = 1; i <= n; i++) {
read(a[i]);
if (a[i] > mx) {
mx = a[i];
id = i % 2;
} else if (a[i] == mx) chkmax(id, i % 2);
}
writeln(mx + (id + n) / 2);
}
//fwrite(pf, 1, o1 - pf, stdout);
return 0;
}
B
模擬就行,一開始看錯題目了媽的
const int N = 1e5 + 5;
int T, n, q, x[N];
inline bool check(int x, ll k) {
return 1ll * n * (n - 1) / 2 - 1ll * x * (x + 1) / 2 >= k;
}
map <ll, ll> h;
signed main(void) {
for (read(T); T; T--) {
read(n); read(q);
for (int i = 1; i <= n; i++) read(x[i]);
for (int i = 1; i < n; i++) {
h[1ll * i * (n - i)] += x[i + 1] - x[i] - 1;
h[1ll * i * (n - i + 1) - 1]++;
// h[1ll * (i + 1) * (n - i) - 1]++;
}
h[n - 1]++;
while (q--) {
ll k; read(k);
if (h.find(k) == h.end()) { writeln(0, ' '); }
else writeln(h[k], ' ');
}
puts("");
h.clear();
}
//fwrite(pf, 1, o1 - pf, stdout);
return 0;
}
C
\(O(n)\) 判斷,滿足即是最大值。
const int N = 2e5 + 5;
int T, n; ll a[N], k;
signed main(void) {
for (read(T); T; T--) {
read(n), read(k); ll tot = 0, mx = 0;
for (int i = 1; i <= n; i++) read(a[i]), tot += a[i], chkmax(mx, a[i]);
ll ans = 1;
for (ll i = n; i >= 1; i--) {
ll j = max((tot + i - 1) / i, mx);
if (i * j - tot <= k) { ans = i; break; }
}
writeln(ans);
}
//fwrite(pf, 1, o1 - pf, stdout);
return 0;
}
D
本質是區間的交的長度。中間要判斷一下是否滿足連續否則為0
const int N = 2e5 + 5;
int T, n, a[N], pre[N], suf[N], p1[N], p2[N];
signed main(void) {
for (read(T); T; T--) {
read(n);
for (int i = 1; i <= n; i++) read(a[i]);
int mx = 1, mn = n;
for (int i = 1; i <= n; i++) {
p2[i] = a[i] + i - 1;
p1[i] = i - a[i] + 1;
chkmax(mx, p1[i]);
chkmin(mn, p2[i]);
}
pre[0] = n + 1;
for (int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], p2[i]);
suf[n + 1] = 0;
for (int i = n; i >= 1; i--) suf[i] = max(suf[i + 1], p1[i]);
bool f = true;
for (int i = 1; i <= n; i++) {
p2[i] = a[i] + i - 1;
p1[i] = i + 1 - a[i];
if (pre[max(p1[i] - 1, 0)] < i || suf[min(p2[i] + 1, n + 1)] > i) f = false;
}
if (f) writeln(max(mn - mx + 1, 0));
else writeln(0);
}
//fwrite(pf, 1, o1 - pf, stdout);
return 0;
}
E
差分,找標記最多的深度,然後開始砍
const int N = 5e5 + 5;
int T, n; vector <int> G[N];
int dep[N], d[N], h[N], mx = 0, ans = 0, ret = 0;
inline void dfs(int u, int f) {
dep[u] = dep[f] + 1;
d[u] = dep[u];
for (auto v : G[u]) {
if (f == v) continue;
dfs(v, u); chkmax(d[u], d[v]);
// writeln(d[v], ' '), writeln(dep[v]);
h[dep[v]]++; h[d[v] + 1]--;
}
}
inline void dfs2(int u, int f) {
for (auto v : G[u]) {
if (f == v) continue;
dfs2(v, u); if (d[v] < ans || dep[v] > ans) ++ret;
}
}
signed main(void) {
for (read(T); T; T--) {
read(n); h[1] = 0; mx = 0; ans = 0; ret = 0;
for (int i = 1; i <= n; i++) G[i].clear();
for (int i = 1, u, v; i < n; i++) {
read(u), read(v);
G[u].push_back(v);
G[v].push_back(u);
h[i + 1] = dep[i + 1] = d[i + 1] = 0;
}
dfs(1, 0);
for (int i = 2; i <= n; i++) h[i] += h[i - 1];
for (int i = 1; i <= n; i++) if (h[i] > mx) mx = h[i], ans = i;
dfs2(1, 0);
writeln(ret);
}
//fwrite(pf, 1, o1 - pf, stdout);
return 0;
}