Educational Codeforces Round 174 (Rated for Div. 2)

news/2025/2/19 1:05:08/文章来源:https://www.cnblogs.com/maburb/p/18723206

A. Was there an Array?

题意:一个长度为\(n\)\(a\)数组,变成了长度为\(n-2\)\(b\)数组,对于每个\(i \in [2, n - 1]\),如果\(a_i == a_{i-1} \&\& a_i == a_{i+1}\)\(b_{i-1} = 1\),否则等于\(0\)。现在给你一个\(b\)数组,判断有没有一个\(a\)数组可以变成\(b\)

如果\(b\)中有\(1,0,1\)这个子数组,那么一定没有对应的\(a\)数组,因为\(a_{i-1} = a_{i} = a_{i + 1}, a_{i+1} = a_{i+2} = a_{i+3}\)可以得出这几个都相等,但中间有个零,告诉你有三个数不都相同,产生矛盾。否则一定可以,因为两个\(1\)之间有两个以上的零是可以构造方案的,其他情况也是合法的。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n - 2);for (int i = 0; i < n - 2; ++ i) {std::cin >> a[i];}for (int i = 0; i + 2 < n - 2; ++ i) {if (a[i] == 1 && a[i + 1] == 0 && a[i + 2] == 1) {std::cout << "NO\n";return;}}std::cout << "YES\n";
}

B. Set of Strangers

题意:给你一个矩阵,你每次可以选择一些元素,使得它们的值都相同且没有两个元素相邻,然后把他们变成另一种元素,问让整个矩阵相同的最小操作数。

发现同一种颜色最多操作两次,如果这个颜色每个元素都不相邻,那么只需要一次就可以全部变,如果有相邻点,那么可以取\(i + j\)是偶数的位置一组,和\(i + j\)是奇数的位置一组,这两类的每一类中的元素一定不相邻,所有最多两次操作。

于是把每个元素的操作数存下来,排序后除最后一个不选,其他颜色的操作数都算上。

点击查看代码
void solve() {int n, m;std::cin >> n >> m;std::vector a(n, std::vector<int>(m));for (int i = 0; i < n; ++ i) {for (int j = 0; j < m; ++ j) {std::cin >> a[i][j];-- a[i][j];}}const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};std::vector<int> cnt(n * m);for (int i = 0; i < n; ++ i) {for (int j = 0; j < m; ++ j) {if (cnt[a[i][j]] < 2) {cnt[a[i][j]] = 1;for (int k = 0; k < 4; ++ k) {int x = i + dx[k], y = j + dy[k];if (x < 0 || x >= n || y < 0 || y >= m) {continue;}if (a[i][j] == a[x][y]) {cnt[a[i][j]] = 2;}}}}}std::vector<int> b;for (int i = 0; i < n * m; ++ i) {if (cnt[i]) {b.push_back(cnt[i]);}}std::sort(b.begin(), b.end());int ans = 0;for (int i = 0; i + 1 < b.size(); ++ i) {ans += b[i];}std::cout << ans << "\n";
}

C. Beautiful Sequence

题意:给你一个数组,只有\(1, 2, 3\)三种值,你要选以\(1\)开头,\(3\)结尾,中间若干个\(2\)的子序列,求有多少个。

预处理\(pre1, suf2, suf3\),,表示\(1\)的个数的前缀和,\(2\)的个数的后缀和,\(3\)的个数的后缀和。然后枚举每个\(2\),只选这个\(2\)在中间就有\(pre1_i \times suf3_i\)种选法,然后考虑在前面选若干个\(2\),设\(j < i, a_j == 2\),前面每个\(2\)\(1\)的后面的选法有\(pre1_j\)个,但两个\(2\)中间有一些\(2\)这些\(2\)可选可不选,一共\(2^{suf2_j - suf2_i - 1}\)种选法,但发现不好处理,可以直接算是\(2^{suf2_j - 1}\)个,那么前面总共是\(\sum_j pre1_j \times 2^{suf2_j - 1} \times suf3_i\)的贡献,考虑消除重复的贡献,直接都除上\(2^{suf2_i}\)就行了,\(\frac{\sum_j pre1_j \times 2^{suf2_j - 1} \times suf3_i}{2^{suf2_i}} = \sum_{j} pre1_j \times 2^{suf2_j - suf2_i - 1} \times suf3_i\),正好是我们所求的。

点击查看代码
void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int i = 0; i < n; ++ i) {std::cin >> a[i];}std::vector<int> pre1(n + 1), suf2(n + 2), suf3(n + 2);for (int i = 0; i < n; ++ i) {pre1[i + 1] = pre1[i] + (a[i] == 1);}for (int i = n - 1; i >= 0; -- i) {suf2[i + 1] = suf2[i + 2] + (a[i] == 2);suf3[i + 1] = suf3[i + 2] + (a[i] == 3);}Z ans = 0, pre = 0;for (int i = 1; i <= n; ++ i) {if (a[i - 1] == 2) {ans += (Z)pre1[i] * suf3[i] + pre / power<Z>(2, suf2[i]) * suf3[i];pre += pre1[i] * power<Z>(2, suf2[i] - 1);}}std::cout << ans << "\n";
}

D. Palindrome Shuffle

题意:给你一个字符串,你可以进行一次操作,重新排列一个区间,使得字符串是回文串,求区间最短长度。

\(l\)\(s[1, l - 1] != s[n - l + 1, n]\)的最小的位置,\(r\)\(s[r, n / 2] != s[n / 2 + 1, n - r + 1]\)的最大的位置,那么看\(s[l ... r]\)\(s[n - r + 1 ... n - l + 1]\)的字符数是不是相等,如果相等,则可以重排\(s[l .. r]\)使得字符串是回文串。
否则我们可以二分往中间左边走几步和往中间右边走几步,看重排这个区间能否是回文串,\(check\)就是先判断对称的另一边没被选择的位置上的字符在这个区间是不是足够,然后剩下的一定要是偶数,因为要左边一个右边一个。

点击查看代码
void solve() {std::string s;std::cin >> s;int n = s.size();std::vector<std::array<int, 26>> sum(n + 1);for (int i = 0; i < n; ++ i) {sum[i + 1] = sum[i];sum[i + 1][s[i] - 'a'] += 1;}int l = 0;while (l < n / 2 && s[l] == s[n - 1 - l]) {++ l;}if (l == n / 2) {std::cout << 0 << "\n";return;}int r = n / 2 - 1;while (r > l && s[r] == s[n - 1 - r]) {-- r;}bool flag = true;++ l, ++ r;for (int i = 0; i < 26; ++ i) {if (sum[r][i] - sum[l - 1][i] != sum[n - l + 1][i] - sum[n - r][i]) {flag = false;break;}}if (flag) {std::cout << r - l + 1 << "\n";} else {auto check1 = [&](int k) -> bool {std::array<int, 26> cnt{};for (int i = 0; i < 26; ++ i) {cnt[i] = sum[n / 2 + k][i] - sum[l - 1][i];}for (int i = (n - l + 1); i > n / 2 + k; -- i) {if ( -- cnt[s[i - 1] - 'a'] < 0) {return false;}}for (int i = 0; i < 26; ++ i) {if (cnt[i] & 1) {return false;}}return true;};int L = 1, R = (n - l + 1) - n / 2;while (L < R) {int mid = L + R >> 1;if (check1(mid)) {R = mid;} else {L = mid + 1;}}int ans = L + n / 2 - l + 1;auto check2 = [&](int k) -> bool {std::array<int, 26> cnt{};for (int i = 0; i < 26; ++ i) {cnt[i] = sum[n - l + 1][i] - sum[n / 2 - k][i];}for (int i = l; i < n / 2 - k + 1; ++ i) {if ( -- cnt[s[i - 1] - 'a'] < 0) {return false;}}for (int i = 0; i < 26; ++ i) {if (cnt[i] & 1) {return false;}}return true;};L = 1, R = n / 2 - l + 1;while (L < R) {int mid = L + R >> 1;if (check2(mid)) {R = mid;} else {L = mid + 1;}}ans = std::min(ans, L + (n - l + 1) - n / 2);std::cout << ans << "\n";}
}

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

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

相关文章

ArrayBlockingQueue的take()底层原理

一、ArrayBlockingQueue 的 take() 方法的底层源码的详细介绍 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 take() 方法是用于从队列中移除并返回队首元素的核心方法之一。当队列为空时,take() 方法会阻塞当前线程,…

【CodeForces训练记录】Educational Codeforces Round 174 (Rated for Div. 2)

训练情况赛后反思 被英语读题背刺了,原来 C 题里面的 an element 不是 exacly one element 的意思,是 at least one element,读错题被一直硬控,这题没做出来的死因是高中组合数学。 A题 我们手玩样例可以发现 101 的情况必定不合法,abcd,第一个1说明abc相等,第三个1说明…

关于ENSP中 防火墙USG6000V 配置了双机热备后重启发现接口的VRRP状态变成Initialize状态的故障分析

一、故障现象:开启一个大型的配置正常的ENSP拓扑时,发现两台防火墙(主备)的接口vrrp状态都一直是Initialize状态,无法切换到master或者backup状态,或者部分接口正常。(测试发现,该故障在高配置的电脑上不是必然发生) 具体故障截图如下(vrrp状态会一直卡着初始状态,不…

关于ENSP中USG6000V重启后VRRP状态变成Initialize

一、故障现象:开启一个大型的配置正常的ENSP拓扑时,发现两台防火墙(主备)的接口vrrp状态都一直是Initialize状态,无法切换到master或者backup状态,或者部分接口正常。(测试发现,该故障在高配置的电脑上不是必然发生) 具体故障截图如下(vrrp状态会一直卡着初始状态,不…

Transformer——CNN和RNN的颠覆者?【论文精读随笔】

transformer是一种基于自注意力机制的深度神经网络模型,通过并行处理和长距离依赖捕捉,显著提升序列建模效率。其多头注意力设计增强特征提取能力,位置编码保留序列顺序信息。在机器翻译、NLP等领域表现卓越,并广泛扩展至视觉、语音等多模态任务。一、技术背景 RNN的困境与…

ArrayBlockingQueue的put方法底层原理

一、ArrayBlockingQueue的put方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 put 方法是用于向队列中插入元素的核心方法之一。当队列满时,put 方法会阻塞当前线程,直到队列有空闲空间 1、put 方法的功能…

初始工程的排错

如图的错误如何排掉呢:看如下步骤截图 step1: 在idea的初始界面的右上角点击齿轮图标,然后点击"Project Structure",然后看到如下图:两个下拉框都选择jdk17,然后点击“ok” step2: 然后点击“settings”,找到“Build, Execution, Deployment”,然后点击“Bu…

黑马点评3:基于Redis实现共享session登录

在之前基础上,登录流程的变化:保存用户信息数据类型:最终:修改代码: 1. 发送验证码:src/main/java/com/hmdp/service/impl/UserServiceImpl.java@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resource…

这份DeepSeek免费资源清单请收好(手慢无)

你是不是也遇到过这样的困境👇 👉 和Deepseek对话遇到“服务器繁忙,请稍候再试” 👉 动不动Deepseek App无响应,一堆Prompt白写 👉 想用第三方Deepseek却被告知"额度已用尽" 今天偷偷告诉你:大厂早就接入了DeepSeek满血版,免费羊毛速来!(建议先收藏再阅…

西电校园网通过PPPoE方式单线多拨

西电校园网通过PPPoE单线多拨的方式实现带宽的叠加,实现总带宽的有效利用。前言 西电的收费校园网现阶段(2025.2)执行的设备管控策略如下:一个账号可同时在线 6 台设备。 限速仅针对单设备,最高速率为 200M。针对这种设备数限制宽松的管控策略,一个非常自然的想法就是可以…

PyTorch入门--手写数字识别项目

概述 本文整理自BiliBli的《孔工码字》, 这是一个很好的视频号。讲的非常好,整理在这里,自己学习 他的Gitee地址:https://gitee.com/kongfanhe 本文通过手写数字识别项目来学习如何搭建训练神经网络。 PyTorch框架 在这个项目里,我们使用PyTorch框架,它是由Facebook开发的…

vscode+continue+ollama+deepseek-r1 实现AI代码自动补全

准备 下载: vscode: https://code.visualstudio.com/download continue( vscode 插件): https://marketplace.visualstudio.com/items?itemName=Continue.continue ollama: https://ollama.com/download deepseekR1: https://ollama.com/library/deepseek-r1 (通过 ollama…