Codeforces Round 916(Div.3) A~G

A.Problemsolving Log(计数)

题意:

26 26 26个问题 A ∼ Z A \sim Z AZ,分别需要尝试 1 ∼ 26 1 \sim 26 126次才能通过。

给出一个字符串,里面包含的每个字母代表着这道题目的一次尝试,问:总共通过了多少题目。

分析:

使用数组记录每个字母的出现次数,如果 A A A出现了一次, B B B出现了两次,…,就代表该题目通过了,记录过题数量即可。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 100005;int vis[30];void solve() {memset(vis, 0, sizeof (vis));int n;string s;cin >> n >> s;for (int i = 0; i < n; i++) {vis[s[i] - 'A']++;}int ans = 0;for (int i = 0; i <= 25; i++) {if (vis[i] > i) ans++;}cout << ans << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

B.Preparing for the Contest(构造)

题意:

给出一个难度序列,序列中 a [ i ] > a [ i − 1 ] a[i] > a[i - 1] a[i]>a[i1]的个数为该序列的难度系数,求长度为 n n n且难度系数为 k k k的序列。

分析:

首先,让序列为增序,即 1 , 2 , . . . , n 1, 2, ..., n 1,2,...,n,然后,除最后 k k k个元素外,将前面部分翻转,变为: n − k , n − k − 1 , . . . , 1 , n − k + 1 , . . . , n n - k, n - k - 1, ..., 1, n - k + 1, ..., n nk,nk1,...,1,nk+1,...,n

此时,前面的 n − k ∼ 1 n- k \sim 1 nk1均为降序,不会产生难度系数,后面的 k + 1 k + 1 k+1个元素(包含前面部分结尾的1)为升序,会产生 k k k个难度系数,满足题目要求。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 100005;void solve() {int n, k;cin >> n >> k;for (int i = n - k; i >= 1; i--) {cout << i << ' ';}for (int i = n - k + 1; i <= n; i++) {cout << i << ' ';}cout << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

C.Quests(枚举)

题意:

n n n个关卡,你只能从前往后进行闯关(通过上一关才能进入下一关),第一次通过第 i i i个关卡时可以获得 a i a_i ai点积分,之后再次通过第 i i i个关卡时可以获得 b i b_i bi点积分,问如果能闯关 k k k次,最多能获得多少积分。

分析:

不难发现,最多只会在一个关卡进行多次通过,那么只需要枚举最后到达的关卡,并记录过程中遇到过的关卡的 b i b_i bi中的最大值 m a x b i max_{b_{i}} maxbi,那么到达第 i i i关的最大积分为: a 1 + a 2 + . . . + a i + ( k − i ) × m a x b i , i ≤ k a_1 + a_2 + ... + a_i + (k - i) \times max_{b_{i}},i \le k a1+a2+...+ai+(ki)×maxbi,ik

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5e2;int a[N], b[N];void solve() {int n, k;cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= n; i++) {cin >> b[i];}int ans = 0, tmp = 0, maxn = 0;for (int i = 1; i <= n; i++) {tmp += a[i];maxn = max(maxn, b[i]);if (k >= i) {ans = max(ans, tmp + max(0, k - i) * maxn);}}cout << ans << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

D.Three Activities(枚举)

题意:

n n n天里,每天有三种活动:

  • 滑雪

  • 看电影

  • 玩游戏

在第 i i i天,有 a i a_i ai人会参加活动 1 1 1,有 b i b_i bi人会参加活动 2 2 2,有 c i c_i ci人会参加活动 3 3 3

每个活动只能进行一次,且每天只能完成一个活动,问最多能召集多少个朋友完成所有活动。

分析:

不难想到,每个活动只有人数最多的三天会被选择,仅记录每个活动人数最多的三天,枚举所有的方案,记录可行的方案中人数最大的即可。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5e2;struct Node{int val, id;bool operator < (const Node &o) const  {return val > o.val;}
};Node a[N], b[N], c[N];void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i].val;a[i].id = i;}for (int i = 1; i <= n; i++) {cin >> b[i].val;b[i].id = i;}for (int i = 1; i <= n; i++) {cin >> c[i].val;c[i].id = i;}sort(a + 1, a + n + 1);sort(b + 1, b + n + 1);sort(c + 1, c + n + 1);int ans = 0;for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 3; j++) {for (int k = 1; k <= 3; k++) {if (a[i].id == b[j].id || b[j].id == c[k].id || a[i].id == c[k].id) continue;ans = max(ans, a[i].val + b[j].val + c[k].val);}}}cout << ans << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

E.Game with Marbles(贪心)

题意:

两个人进行石子游戏,每个人均拥有 n n n种不同的石子,且每种石子的数量不同(但两人的石子种类相同),当轮到某人操作时,他可以选择手上的一种石子,丢掉其中一颗石子,并让对手丢掉相同颜色的全部石子(只有对手手上还有这种颜色的石子时才能进行)。

游戏结束时,先手手上剩下的石子数量减去后手手上剩余的石子数量就是最后的得分。

先手希望结束时得分尽可能高,后手希望得分尽可能低,而两人都极为聪明,每次操作均会选择最优策略,问最后的得分是多少?

分析:

对于Easy Version,由于石子数量较小 ( n ≤ 6 ) (n \le 6) (n6),那么可以对两人的操作进行模拟,来得到答案。

对于Hard Version,考虑贪心,通过模拟后可以发现,实际上每个人操作时,会选择剩下的石子中 a i + b i a_i + b_i ai+bi最大的颜色 i i i进行操作,因为哪怕自己这种颜色的石子很少,但也可以消除对手最多的石子。

因此,使用结构体存储先后手的石子数量,对两者拥有的石子数量总和从大到小进行排序,然后从前往后模拟操作即可。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int N = 2e5 + 5e2;struct Node{int a, b;bool operator < (const Node &o) const  {return a + b > o.a + o.b;}
};Node g[N];void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> g[i].a;}for (int i = 1; i <= n; i++) {cin >> g[i].b;}sort(g + 1, g + n + 1);LL ans = 0;for (int i = 1; i <= n; i++) {if (i & 1) {ans += g[i].a - 1;} else {ans -= g[i].b - 1;}}cout << ans << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

F.Programming Competition(树形DP)

题意:

有一个公司需要选择若干个人两两组队参与比赛,且选择的两个人中不能存在上下级关系(直接和间接均不行),问:最多可以组成多少只队伍?

分析:

实际上公司的上下级关系就是一个树形的关系,对于上下级关系,只要两个节点不在同一棵子树上,那么可以任意进行组队。

因此,当某个节点的子树数量大于 1 1 1时,使用 s u m sum sum表示所有子树节点之和, m a x n maxn maxn表示最大子树中节点数量, m a x c maxc maxc表示最大子树中已经匹配的队伍数,有以下两种情况:

  • 最大的子树中节点数量 m a x n maxn maxn减去以及可以完成匹配的人数后小于等于其他子树中的节点数量总和 s u m − m a x n sum - maxn summaxn,即 m a x n − m a x c × 2 ≤ s u m − m a x n maxn - maxc \times 2 \le sum - maxn maxnmaxc×2summaxn,此时能组成的队伍数为 ⌊ s u m 2 ⌋ \lfloor \frac{sum}{2} \rfloor 2sum

  • 否则,此时能组成的队伍数为已经匹配的人数加上其他子树中所有节点数量,即 m a x c + s u m − m a x n maxc + sum - maxn maxc+summaxn

如果子树数量等于 1 1 1,那么只能直接继承子树的状态。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int N = 2e5 + 5e2;vector<int> G[N];
int n, sz[N], dp[N];//节点总数,子树大小,子树能组成的队伍数void dfs(int root) {sz[root] = 1;dp[root] = 0;int len = G[root].size();int maxn = 0, maxc = 0, sum = 0;for (int i = 0; i < len; i++) {int v = G[root][i];dfs(v);sz[root] += sz[v];dp[root] = max(dp[root], dp[v]);if (maxn < sz[v]) {maxn = sz[v];maxc = dp[v];}sum += sz[v];}if (len <= 1) return;if (sum - maxn >= maxn - maxc * 2) {dp[root] = sum / 2;} else {dp[root] = sum - maxn + maxc;}
}void solve() {cin >> n;for (int i = 1; i <= n; i++) {G[i].clear();}for (int i = 2; i <= n; i++) {int u;cin >> u;G[u].push_back(i);}dfs(1);cout << dp[1] << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

G.Light Bulbs(线段树优化建图+强连通分量)

题意:

本题两个版本不同之处在于数据范围。

2 n 2n 2n个灯泡排成一排。每个灯泡都有从 1 1 1 n n n的颜色(每种颜色正好有两个灯泡)。

最初,所有的灯泡都是关掉的。选择一组灯泡 S S S,按任意顺序执行任意次数以下操作:

  • 选择两个颜色相同的灯泡 i i i j j j,且其中一个是亮着的,打开另一个灯泡;
  • 选择三个灯泡 i , j , k i,j,k i,j,k,要求灯泡 i i i k k k都是亮着且颜色相同,灯泡 j j j在它们之间(即 i < j < k i < j < k i<j<k),打开灯泡 j j j

题目希望选择一组灯泡 S S S,通过执行上述操作,确保所有灯泡都是打开的。

计算两个数字:

  • 最初可以选择的最小灯泡数量,即一组灯泡 S S S包含的最小数目。
  • 最小灯泡数量对应的的方案数(结果对998244353取模)。

分析:

对于简单版本,假设最坏情况下,整个区间都变成一个环。例如 [ 1 , 2 , 1 , 2 ] [1,2,1,2] [1,2,1,2],点 1 1 1可以到点 2 2 2,点 2 2 2可以到点 1 1 1,构成环。如果是 [ 1 , 2 , 2 , 1 ] [1,2,2,1] [1,2,2,1],点 1 1 1可以到点 2 2 2,但是点 2 2 2不能到 1 1 1。把环缩成点后就变成了经典的拓扑排序问题。最小数目就是这个拓扑排序入度为 0 0 0的点,方案数就是入度为 0 0 0的点相乘即可。

困难版本的思路如下:

首先可以发现同种颜色的点我们只会取一个,然后发现如果我们取了某种对应位置为 [ l , r ] [l,r] [l,r]的点,那么我们同时也取了 [ l + 1 , r − 1 ] [l+1,r−1] [l+1,r1]之间的所有点。

如果取了颜色 a a a后,颜色 b b b也能自动被取,连一条从 a a a指向 b b b的边。

对这样的图跑强连通分量,只需要操作所有入度为 0 0 0的点即可,假设一个入度为 0 0 0的强连通分量里有 x x x种颜色,那么有 2 x 2x 2x种取法,用乘法原理统计答案即可。

直接暴力连边复杂度 O ( n 2 ) O(n^2) O(n2),这样只能做 e a s y easy easy版本。

对于 h a r d hard hard版本,使用线段树优化建图,用线段树实现对一个区间内的所有点连边,然后再跑强连通分量即可。但是此时需要操作就不一定是入度为 0 0 0的强连通分量了,因为有可能入度为 0 0 0的是线段树上的点组成的强连通分量。

此时可以按照拓扑序跑一遍 D P DP DP,找到所有没有任何颜色进入(线段树上的点可以进入)的强连通分量再统计答案即可。时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),空间复杂度为 O ( n ) O(n) O(n)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN=4e5+5;
const int MOD=998244353;struct S1{vector<vector<int>>g,scc;vector<int>dfn,low,stk,id;vector<bool>ins;int ts,n;S1(const vector<vector<int> > &g) : g(g){n = (int)g.size();dfn.assign(n, 0);low.assign(n, 0);id.assign(n, -1);ins.assign(n, false);stk.reserve(n);ts = 0;build();}void tarjan(int u){dfn[u] = low[u] = ++ts;stk.push_back(u);ins[u] = 1;for(auto j : g[u]){if (!dfn[j]){tarjan(j);low[u] = min(low[u], low[j]);}else if (ins[j]) low[u] = min(low[u], dfn[j]);}if (dfn[u] == low[u]){int scc_cnt = scc.size();scc.push_back({});int y;do{y = stk.back();stk.pop_back();id[y] = scc_cnt;ins[y] = 0;scc.back().push_back(y);}while(y != u);}}void build(){for(int i = 0; i < n; i++){if (!dfn[i]){tarjan(i);}}}
};vector<vector<int> > g;
int a[MAXN];
int n;void build(int u, int l, int r){if (l == r){g[u].push_back(8 * n + a[r]);return;}int mid = (l + r) / 2;g[u].push_back(2 * u);g[u].push_back(2 * u + 1);build(2 * u, l, mid); build(2 * u + 1, mid + 1, r);
}void modify(int u, int l, int r, int L, int R, int x){if (l > R || r < L) return;if (l >= L && r <= R){g[x].push_back(u);return;}int mid = (l + r) / 2;modify(2 * u, l, mid, L, R, x);modify(2 * u + 1, mid + 1, r, L, R, x);
}int main(){int T;cin >>T;while(T--){cin >> n;vector<array<int, 2> > pos(n + 1);for(int i = 1; i <= 2 * n; i++){cin >> a[i];if (pos[a[i]][0] == 0){pos[a[i]][0] = i;}else{pos[a[i]][1] = i;}}g.assign(9 * n + 1, {});build(1, 1, 2 * n);for(int i = 1; i <= n; i++){auto [l, r] = pos[i];if (l + 1 <= r - 1){modify(1, 1, 2 * n, l + 1, r - 1, 8 * n + i);}}S1 s1(g);const int m = s1.scc.size();vector<int> c(m);for(int i = 0; i < m; i++){int s = 0;for(auto x : s1.scc[i]){s += (x > 8 * n);}c[i] = s;}int cnt = 0,sum = 1;vector<int>bad(m);for(int i = m - 1; i >= 0; i--){if (!bad[i] && c[i] > 0){cnt += 1;sum = 2LL * sum * c[i] % MOD;}bad[i] |= (c[i] > 0);for(auto x : s1.scc[i]){for(auto j : g[x]){if (s1.id[j] != i){bad[s1.id[j]] |= bad[i];}}}}cout<<cnt<<' '<<sum<<endl;}return 0;
}

学习交流

以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端已死?探讨人工智能与低代码对前端的影响

文章目录 每日一句正能量前言前端行业究竟是好是坏&#xff1f;数字化转型的当下前端工程师该何去何从&#xff1f; 想要入行前端先认清这三个事实 后记 每日一句正能量 人的结构就是相互支撑&#xff0c;众人的事业需要每个人的参与。 前言 随着人工智能和低代码的崛起&#…

【DOM笔记四】事件高级!(注册/删除事件、DOM事件流、事件对象、事件委托、鼠标 / 键盘事件、相关案例)

文章目录 7 事件高级7.1 注册事件概述7.2 删除事件7.3 DOM事件流7.4 事件对象7.5 事件委托7.6 鼠标事件7.6.1 常用的鼠标事件7.6.2 鼠标事件对象 7.7 键盘事件7.7.1 常用的键盘事件7.7.2 键盘事件对象 7 事件高级 7.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或…

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考&#xff1a; Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线&#xff0c;其中X轴是’category’ 类目轴&#xff0c;适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…

关于“Python”的核心知识点整理大全31

目录 12.4.2 在屏幕上绘制飞船 alien_invasion.py ​编辑12.5 重构&#xff1a;模块 game_functions 12.5.1 函数 check_events() game_functions.py alien_invasion.py 12.5.2 函数 update_screen() game_functions.py alien_invasion.py 12.6 驾驶飞船 12.6.1 响应…

RESTful简介与C/C++实现

一、RESTful简介 RESTful&#xff0c;全称为Representational State Transfer&#xff0c;是一种软件架构风格和设计理念&#xff0c;而不是一种标准。它主要用于Web服务的设计和开发&#xff0c;强调资源的状态表示和状态转移。RESTful风格的设计使得Web服务更加简洁、清晰和…

msvcp120.dll丢失的多种详细有效解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。那么&#xff0c;msvcp120.dll到底是什么&#xff1f;为什么会出现丢失的情况&#xff1f;丢失后会对电脑产生什么影响&#xff1f;本文将为您详细解答这些问题&#…

HarmonyOS笔记1

修改字体颜色 在Text里边&#xff0c;按一下 . 就行了&#xff0c;按点号会自动提示 fontColor 函数参数给‘#36D’可以把‘Hello World’调成蓝色 onClick(()>{}) 按钮 如何打印第二句话 Text方法 2023年12月21日11:26:52

项目从0到1,架构选型 :单体架构优先考虑

当我听到关于团队使用微服务架构的故事时&#xff0c;我注意到了一个共同的现象。 几乎所有成功的微服务故事都是从一个过于庞大的庞然大物开始的&#xff0c;后来这个庞然大物被拆分了我所听说的几乎所有从零开始构建微服务系统的案例&#xff0c;最终都陷入了严重的麻烦。 …

强烈推荐的前端学习资源,先收藏!

今天分享一些个人收藏的前端学习资源&#xff0c;按一下几个维度简单划分了下&#xff0c;有 3D、框架、构建工具等等。由于这些地址都是我个人收藏的&#xff0c;所以带有一些强烈的主观意识&#xff0c;还有很多优秀的网址没有收录进来&#xff0c;会不断更新的&#xff0c;欢…

系统分析师(软考)知识点整理(二)

会计相关 会计是指记录、分类、汇总、计量和报告发送在企业经济活动中的财务数据的行为 #mermaid-svg-YBI5YPWzqWhRB4kI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YBI5YPWzqWhRB4kI .error-icon{fill:#552222…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场&#xff0c;提高广告点击率成为各大卖家争相追求的目标。而如今&#xff0c;亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中&#xff0c;搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-B…

linux | 软连接与硬链接 | 实测

很多知识&#xff0c;我们都是通过学习其他博主的博客&#xff0c;可是学习的过程 常常需要辩证的去辨别真伪。这很耗精力&#xff0c;最好的方法就是实践去检测。 软链接 和 应链接 在 linux 上操作非常重要 常见场景&#xff1a;最重要的就是&#xff0c;做备份&#xff0c;尤…

Talk | 约翰霍普金斯大学博士生魏晨: De-Diffusion-文本是不同模态的沟通桥梁

本期为TechBeat人工智能社区第557期线上Talk。 北京时间12月20日(周三)20:00&#xff0c;约翰霍普金斯大学博士生—魏晨的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “De-Diffusion-文本是不同模态的沟通桥梁题”&#xff0c;介绍了她的团队在如…

Linux---进程状态

目录 一、系统进程状态介绍 1.运行状态 2.阻塞状态 3.挂起状态 二、Linux中的进程状态 1.R (running) 2.S (sleeping) 3.D&#xff08;disk sleep&#xff09; 4.T&#xff08;stopped&#xff09; 5.t&#xff08;tracing stop&#xff09; 6.X&#xff08;dead&am…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

楼宇对讲、可视门铃案例分析

语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器、衰减器和几种控制 功能&#xff0c;包括发送和接收衰减器、 背景噪声电平检测系统和一个衰 减器控制系统&#xff0c;对发送和接收电 平好于背景噪声做出反…

PyCharm添加自动函数文档注释

目录 1、背景2、开启PyCharm自动函数文档注释 1、背景 规范的函数文档注释有助于他人理解代码&#xff0c;便于团队协作、提高效率。但如果我们自己手写函数文档注释将非常耗时耗力。PyCharm安装后默认没有开启自动化函数文档注释&#xff0c;需要我们开启 2、开启PyCharm自动…

反序列化 [SWPUCTF 2021 新生赛]ez_unserialize

打开题目 查看源代码 得到提示&#xff0c;那我们用御剑扫描一下看看 我们知道有个robots.txt&#xff0c;访问一下得到 那我们便访问一下 cl45s.php看看 得到网站源代码 <?phperror_reporting(0); show_source("cl45s.php");class wllm{public $admin;public …