Codeforces Round 975 (Div. 2)

EternalEpic發表於2024-09-28

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;
}

相關文章