尧图网络科技 Logo 尧图网络科技
  • 首页
  • 关于我们
  • 建站服务
  • UI 设计
  • 案例展示
  • SEO 优化
  • 资讯中心
  • 联系我们

资讯详情

深度解读 · 专业分析

  • 首页
  • 资讯中心
  • /
  • Educational Codeforces Round 183 (Rated for Div. 2)题解

最新资讯

  • 全部资讯
  • 行业动态
  • UI 设计
  • SEO 优化
  • 网站开发

Educational Codeforces Round 183 (Rated for Div. 2)题解

📅 发布时间:2026/6/18 9:51:25 👁 浏览次数:
Educational Codeforces Round 183 (Rated for Div. 2)题解

Educational Codeforces Round 183 (Rated for Div. 2)题解

Educational Codeforces Round 183 (Rated for Div. 2) 题解

A

直接提前分给三人,看看余下多少,然后用 3 去相减就行了。不过注意 3 的倍数的情况是 0。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long longint n;void solve () {cin >> n;int res = n%3;if (!res) cout << "0\n";else cout << 3-res << "\n";
}int main () {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int _ = 1; cin >> _;while (_--) solve();return 0;
}

B

挺有意思的一道题目。

其实通过手推我们不难发现,如果有一个操作是 2,那么只要后面跟了个 0 或者 1,只能保证将 2 带来的 ? 再往里面缩一格,因为此时只能保证原来的最外面的那一层被 0 或者 1 带走,但是里面一层的情况未知。

所以我们可以发现规律,我们先统计出所有的 0 和 1 的数量,提前操作出 -,然后再在剩下的里面填入 ? 以及 +,但是注意,如果剩下的牌的数量如果 \(\leq cnt_2\),那么剩下的牌也一定会被全部删除,可以全部填上 -。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int N = 2e5+100;int n, k;
char ans[N];void solve () {cin >> n >> k;for (int i = 1;i <= n;i++) ans[i] = ' ';string s; cin >> s;int zero = 0, one = 0, two = 0, l = 1, r = n;for (int i = 0;i < k;i++) {if (s[i] == '0') zero++;else if (s[i] == '1') one++;else two++;}for (int i = 1;i <= zero;i++) ans[l++] = '-';for (int i = 1;i <= one;i++) ans[r--] = '-';int res = n-zero-one;if (res <= two) for (int i = l;i <= r;i++) ans[i] = '-';else {for (int i = 1;i <= two;i++) ans[l++] = '?';for (int i = 1;i <= two;i++) ans[r--] = '?';for (int i = l;i <= r;i++) ans[i] = '+';}for (int i = 1;i <= n;i++) cout << ans[i];cout << "\n";
}int main () {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int _ = 1; cin >> _;while (_--) solve();return 0;
}

C

有意思的前缀和。

不难发现,我们假设有 \(cnt_a, cnt_b\),题目的要求就是找到一段连续的子串使得当前这一段的 \(|cnt_a - cnt_b| == |cnt_{total_a} - cnt_{total_b}|\)。

所以我们可以考虑前缀和,用 \(O(n)\) 的复杂度统计,然后记录每一个前缀和的最近的出现位置,然后每看到一个前缀和 \(pre\),我们就去找 \(k-pre\) 的位置,这样子可以以贪心的思想满足题目要求。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long longvoid solve() {int n; string s;cin >> n >> s;int cnta = 0, cntb = 0;for (int i = 0;i < n;i++) {if (s[i] == 'a') cnta++;else cntb++;}if (cnta == cntb) {cout << 0 << endl;return;}int need = cnta - cntb;unordered_map<int, int> pos;int tmp = 0;pos[0] = -1;int minn = INT_MAX;for (int i = 0; i < n; i++) {if (s[i] == 'a') tmp++;else tmp--; int needed = tmp - need;if (pos.count(needed)) {int len = i - pos[needed];if (len < n) minn = min(minn, len);}pos[tmp] = i;}if (minn == INT_MAX) cout << -1 << "\n";else cout << minn << "\n";return;
}int main() {ios::sync_with_stdio(false);cin.tie(NULL), cout.tie(nullptr);int _ = 1; cin >> _;while (_--) solve();return 0;
}

D

比较难的一道 dp,赛时也是被大佬指点迷津才做出来的。

首先分析题目的 反转值,发现只有递增的数组才不会有反转值的贡献,于是我们考虑有 \(m\) 个只递增的数组,每段的长度为 \(l_1, l_2, l_3 \dots l_m\)。

然后发现,总数组的子数组个数为 \(\frac{n\times(n+1)}{2}\),而所有递增的子数组的子数组个数为 \(\sum_{i = 1}^m\frac{l_i\times(l_i+1)}{2}\),于是想到容斥原理,该总数组的反转值就为 \(\frac{n\times(n+1)}{2} - \sum_{i = 1} ^ m\frac{l_i\times(l_i+1)}{2} = k\)。

发现这个思路可以试试 dp,于是开始考虑 dp 的状态,将其设为:

\(dp_{i, j}\) 表示用 \(i\) 个数字能否得到 \(j\) 个递增子数组。

\(g_{i, j}\) 表示上面那种情况时最后一段的长度,这可以方便后面的划分。

那么我们所需要的递增数组可以通过移项得到 \(\frac{n\times(n+1)}{2} - k\),那么我们想到这样的转移方式:

对于每个i从1到n对于每个j从0到need对于每个len从1到icost = len*(len-1)/2如果j≥cost且dp[i-len][j-cost]存在则dp[i][j] = true, g[i][j] = len

那么我们继续想这种转移方程是否是正确的,发现 \(n \leq 30\),完全不怕超时,直接拿下。

前面也说了 \(g_{i, j}\) 是状态 \(i, j\) 时最后一段的长度,所以我们可以考虑回溯构造,一遍遍回溯状态的同时将我们存储的长度存进去,因为是回溯,所以我们最后需要倒转一下:

vector<int> res;
int num = n;
for (int len : seg) {for (int j = num - len + 1; j <= num; j++) {res.push_back(j);}num -= len;
}for (int i = 0; i < n; i++) {cout << res[i];if (i < n - 1) cout << " ";
}
cout << endl;

最后就是完整代码:

#include <bits/stdc++.h>
using namespace std;const int N = 35;
const int S = 435;bool f[N][S + 5];
int g[N][S + 5];void solve() {int n, k;cin >> n >> k;int total = n * (n - 1) / 2;if (k > total) {cout << 0 << endl;return;}int need = total - k;memset(f, false, sizeof(f));memset(g, -1, sizeof(g));f[0][0] = true;for (int i = 1; i <= n; i++) {for (int j = 0; j <= need; j++) {for (int len = 1; len <= i; len++) {int cost = len * (len - 1) / 2;if (j >= cost && f[i - len][j - cost]) {f[i][j] = true;g[i][j] = len;break;}}}}if (!f[n][need]) {cout << 0 << endl;return;}vector<int> seg;int cur = n, val = need;while (cur > 0) {int len = g[cur][val];seg.push_back(len);cur -= len;val -= len * (len - 1) / 2;}reverse(seg.begin(), seg.end());vector<int> res;int num = n;for (int len : seg) {for (int j = num - len + 1; j <= num; j++) {res.push_back(j);}num -= len;}for (int i = 0; i < n; i++) {cout << res[i];if (i < n - 1) cout << " ";}cout << endl;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int _ = 1; cin >> _;while (_--) solve();return 0;
}

相关新闻

干货分享:无需下载,在线快速编辑图片的完整教程

干货分享:无需下载,在线快速编辑图片的完整教程

2026/6/11 20:04:51 查看详情
详细介绍:如何有效删除 iPhone 上的所有内容?

详细介绍:如何有效删除 iPhone 上的所有内容?

2026/6/17 17:04:35 查看详情
m3u8在线播放测试的方法与常见问题解决方案(附网页演示

m3u8在线播放测试的方法与常见问题解决方案(附网页演示

2026/6/17 16:12:50 查看详情
3大核心功能揭秘:如何在树莓派上使用epaper.js构建高性能电子纸显示系统

3大核心功能揭秘:如何在树莓派上使用epaper.js构建高性能电子纸显示系统

2026/6/18 9:49:19 查看详情
贝叶斯建模预测足球胜率:从概率分布到动态先验

贝叶斯建模预测足球胜率:从概率分布到动态先验

2026/6/18 9:49:19 查看详情
3分钟极速调优:Magisk_AsoulOpt游戏性能优化完全指南

3分钟极速调优:Magisk_AsoulOpt游戏性能优化完全指南

2026/6/18 9:49:19 查看详情
2026杭州书法艺考机构综合实力排行 | 十七年积淀,硕博贯通培养 - 奔跑123

2026杭州书法艺考机构综合实力排行 | 十七年积淀,硕博贯通培养 - 奔跑123

2026/6/18 9:47:04 查看详情
2026那曲本地认可的 5 家消防安全评估检测机构实地测评汇总,消防设施检测 + 火灾风险评估 + 电气防火检测 - 中检检测集团

2026那曲本地认可的 5 家消防安全评估检测机构实地测评汇总,消防设施检测 + 火灾风险评估 + 电气防火检测 - 中检检测集团

2026/6/18 9:47:04 查看详情
BSSNN:贝叶斯状态空间神经网络实战指南

BSSNN:贝叶斯状态空间神经网络实战指南

2026/6/18 9:47:04 查看详情
在Android设备上运行完整Linux系统:proot-distro的魔法与实用指南

在Android设备上运行完整Linux系统:proot-distro的魔法与实用指南

2026/6/18 0:01:28 查看详情
ZigBee ZCL事件驱动与基础簇实战:从原理到健壮设备开发

ZigBee ZCL事件驱动与基础簇实战:从原理到健壮设备开发

2026/6/18 0:01:28 查看详情
时间序列分解实战指南:趋势、季节性与残差的工程化解读

时间序列分解实战指南:趋势、季节性与残差的工程化解读

2026/6/18 0:01:28 查看详情
从Landsat到高分系列:手把手教你选择适合自己项目的遥感卫星数据

从Landsat到高分系列:手把手教你选择适合自己项目的遥感卫星数据

2026/6/17 16:21:19 查看详情
福州空调维修上门加氟移机空调不制冷、推荐本地老牌鑫盛达、冷顺安 - 我叫一

福州空调维修上门加氟移机空调不制冷、推荐本地老牌鑫盛达、冷顺安 - 我叫一

2026/6/17 16:06:28 查看详情
嵌入式调试器组件化界面与拖拽交互技术详解

嵌入式调试器组件化界面与拖拽交互技术详解

2026/6/17 16:15:44 查看详情
YOLOv11涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇| 引入CMGF 引导特征融合机制,实现对不同模态特征的自适应增强与高效融合,助力多模态目标检测,小目标检测或分割有效涨点

YOLOv11涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇| 引入CMGF 引导特征融合机制,实现对不同模态特征的自适应增强与高效融合,助力多模态目标检测,小目标检测或分割有效涨点

2026/6/17 21:10:37 查看详情
E-E-A-T 成第一权重:2027 年无经验内容将被彻底淘汰

E-E-A-T 成第一权重:2027 年无经验内容将被彻底淘汰

2026/6/17 21:10:30 查看详情
深圳福田园岭老小区搬家公司推荐 经验足师傅高效搬运攻略 - 从来都是英雄出少年

深圳福田园岭老小区搬家公司推荐 经验足师傅高效搬运攻略 - 从来都是英雄出少年

2026/6/17 21:06:50 查看详情

关于尧图

立足北京本地的一站式网站建设服务与设计教学平台,深耕企业网站定制开发、全网 SEO 优化及网络推广服务。

快速链接

  • 关于我们
  • 建站服务
  • 案例展示
  • 资讯中心

服务项目

  • 企业官网定制
  • UI 界面设计
  • SEO 优化推广
  • 移动端适配

联系方式

电话:400-XXX-XXXX

邮箱:info@zskr.cn

地址:北京市朝阳区 XXX 路 XX 号

© 2026 尧图网络科技 版权所有 | 京 ICP 备 XXXXXXXX 号