[题解][Codeforces 1139A~1139F]Codeforces Round #548 (Div. 2) 简要题解

博客详细解析了Codeforces Round #548 (Div. 2)比赛中的A到F六道题目,包括题意、题解和代码实现。涉及算法包括:子串偶数判断、数组优化、树形DP、莫比乌斯反演 + 期望DP、二分图匹配和扫描线 + 树状数组。
摘要由CSDN通过智能技术生成
  • 终于 rank < 10 了

题目

洛谷 RemoteJudge

Codeforces

A

题意

  • 一个长度为 n n n 的数字串 s s s
  • s s s 有多少个子串,满足子串内的数字顺次连接后得到的数是偶数
  • 1 ≤ n ≤ 65000 1\le n\le 65000 1n65000 s s s 不包含 0 0 0

题解

  • ∑ i = 1 n i [ s [ i ] 是 偶 数 ] \sum_{i=1}^ni[s[i]是偶数] i=1ni[s[i]]

代码

#include <bits/stdc++.h>

// 20030830

inline int read()
{
   
	int res = 0; bool bo = 0; char c;
	while (((c = getchar()) < '0' || c > '9') && c != '-');
	if (c == '-') bo = 1; else res = c - 48;
	while ((c = getchar()) >= '0' && c <= '9')
		res = (res << 3) + (res << 1) + (c - 48);
	return bo ? ~res + 1 : res;
}

typedef long long ll;

const int N = 1e5 + 5;

int n;
char s[N];
ll ans;

int main()
{
   
	n = read();
	scanf("%s", s + 1);
	for (int i = 1; i <= n; i++)
		if (s[i] - '0' + 1 & 1) ans += i;
	std::cout << ans << std::endl;
	return 0;
}

B

题意

  • 一个长度为 n n n 的正整数数组 a a a
  • 求一个长度为 n n n 的非负数组 x x x ,满足
  • (1)对于所有的 1 ≤ i ≤ n 1\le i\le n 1in ,有 0 ≤ x i ≤ a i 0\le x_i\le a_i 0xiai
  • (2)对于所有的 1 ≤ j &lt; i ≤ n 1\le j&lt;i\le n 1j<in ,有 x j = 0 x_j=0 xj=0 x j &lt; x i x_j&lt;x_i xj<xi
  • (3)最大化 ∑ i = 1 n x i \sum_{i=1}^nx_i i=1nxi
  • 求这个最大值
  • 1 ≤ n ≤ 2 × 1 0 5 1\le n\le 2\times10^5 1n2×105 1 ≤ a i ≤ 1 0 9 1\le a_i\le 10^9 1ai109

题解

  • 从右到左考虑,显然每个 x i x_i xi 需要取到它能取到的最大值
  • 也就是说
  • (1) x n = a n x_n=a_n xn=an
  • (2) x i = min ⁡ ( a i , max ⁡ ( 0 , x i + 1 − 1 ) ) x_i=\min(a_i,\max(0,x_{i+1}-1)) xi=min(ai,max(0,xi+11)) 1 ≤ i &lt; n 1\le i&lt;n 1i<n

代码

#include <bits/stdc++.h>

// 20030830

inline int read()
{
   
	int res = 0; bool bo = 0; char c;
	while (((c = getchar()) < '0' || c > '9') && c != '-');
	if (c == '-') bo = 1; else res = c - 48;
	while ((c = getchar()) >= '0' && c <= '9')
		res = (res << 3) + (res << 1) + (c - 48);
	return bo ? ~res + 1 : res;
}

template <class T>
inline T Min(const T &a, const T &b) {
   return a < b ? a : b;}

typedef long long ll;

const int N = 2e5 + 5;

int n, a[N], wt;
ll ans;

int main()
{
   
	n = read();
	for (int i = 1; i <= n; i++) a[i] = read(); wt = a[n] + 1;
	for (int i = n; i >= 1; i--)
	{
   
		wt--; if (wt < 0) wt = 0;
		wt = Min(wt, a[i]);
		ans += wt;
	}
	std::cout << ans << std::endl;
	return 0;
}

C

题意

  • 一棵 n n n 个节点的树,边有红边和黑边
  • 求有多少个节点序列 a 1 … k a_{1\dots k} a1k
  • 满足 a 1 a_1 a1 a 2 a_2 a2 a 2 a_2 a2 a 3 a_3 a3 … \dots a k − 1 a_{k-1} ak1 a k a_k ak k − 1 k-1 k1 条路径中存在一条经过了至少一条黑边
  • 2 ≤ n ≤ 1 0 5 2\le n\le10^5 2n105 2 ≤ k ≤ 100 2\le k\le100 2k100

题解

  • 容易想到一个经典的 O(nk) 树形 DP
  • 用总方案数 n k n^k nk 减掉不经过黑边的方案数
  • 显然,如果只加入所有红边,那么不经过黑边的方案数,就是节点序列 a 1 … k a_{1\dots k} a1k 中所有点位于同一个连通块内的方案数
  • 用并查集维护连通块大小
  • 答案就是 n k n^k nk 减去所有连通块的大小的 k k k 次幂之和

代码

#include <bits/stdc++.h>

// 20030830

inline int read()
{
   
	int res = 0; bool bo = 0; char c;
	while (((c = getchar()) < '0' || c > '9') && c != '-');
	if (c == '-') bo = 1; else res = c - 48;
	while ((c = getchar()) >= '0' && c <= '9')
		res = (res << 3) + (res << 1) + (c - 48);
	return bo ? ~res + 1 : res;
}

const int N = 1e5 + 5, ZZQ = 1e9 + 7;

int qpow(int a, int b)
{
   
	int res = 1;
	while (b)
	{
   
		if (b & 1) res = 1ll * res * a % ZZQ;
		a = 1ll * a * a % ZZQ;
		b >>= 1;
	}
	return res;
}

int n, k, fa[N], sze[N], ans;

int cx(int x)
{
   
	if (fa[x] != x) fa[x] = cx(fa[x]);
	return fa[x];
}

void zm(int x, int y)
{
   
	int ix = cx(x), iy = cx(y);
	if (ix != iy) fa[iy] = ix, sze[ix] += sze[iy];
}

int main()
{
   
	int x, y, z;
	n = read(); k = read();
	for (int i = 1; i <= n; i++) fa[i] = i, sze[i] = 1;
	for (int i = 1; i < n; i++)
	{
   
		x = read(); y = read
抱歉,根据提供的引用内容,我无法理解你具体想要问什么问题。请提供更清晰明确的问题,我将竭诚为你解答。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Codeforces Round 860 (Div. 2)题解](https://blog.csdn.net/qq_60653991/article/details/129802687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【CodeforcesCodeforces Round 865 (Div. 2) (补赛)](https://blog.csdn.net/t_mod/article/details/130104033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Codeforces Round 872 (Div. 2)(前三道](https://blog.csdn.net/qq_68286180/article/details/130570952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值