Codeforces Round 1014 (Div. 2) A-E

news/2025/4/1 11:57:19/文章来源:https://www.cnblogs.com/archer233/p/18800249

\(A. Kamilka and the Sheep\)
\(很简单的题 直接通过观察可以发现和gcd的辗转相减法有关 答案就是最大-最小\)

点击查看代码
void solve(){int n;cin>>n;vector<int>a(n);for (int i=0;i<n;i++) {cin>>a[i];}sort(all(a));cout<<a[n-1]-a[0]<<'\n';
}
$B. Lady Bug$ $观察发现a的奇数位和b的偶数位可以无损的交换,a的偶数位和b的奇数位也同理,那么将其奇偶位叉开分开讨论即可$
点击查看代码
void solve(){int n;cin>>n;string a,b;cin>>a>>b;int even=n/2,odd=n/2+n%2;int cnt_odd=0,cnt_even=0;for (int i=0;i<n;i++) {if (i%2==0) {cnt_odd+=(a[i]=='0');}else cnt_even+=(a[i]=='0');}for (int i=0;i<n;i++) {if (i%2==0) {cnt_even+=(b[i]=='0');}else cnt_odd+=(b[i]=='0');}if (cnt_even>=even&&cnt_odd>=odd) {cout<<"Yes\n";}else cout<<"No\n";
}

\(C. Asuna and the Mosquitoes\)
\(非常简单的一道题 但是赛时脑子抽了写了半天\)
\(易得如果偶数不存在或者奇数不存在那么这题是无法流通的也就是直接取最大值即可\)
\(那么如果奇偶同时存在 我们先可以想到将所有的奇数可以在只保留1的情况下转移到一个偶数上而不改变其奇偶 所有的偶数又可以不改变奇偶的转移到一个奇数上\)
\(那么答案就是所有数的和-奇数的个数+1(因为最后放到一个奇数上必定是最大的)\)

点击查看代码
void solve(){int n;cin>>n;int cnt0=0,cnt1=0,mx=0,sum=0;vector<int>a(n);for (int i=0;i<n;i++){cin>>a[i],sum+=a[i],mx=max(mx,a[i]);if (a[i]&1)cnt1++;else cnt0++;}if (!cnt1||!cnt0){cout<<mx<<'\n';return;}sum-=cnt1-1;if (sum%2==0)sum++;cout<<sum<<'\n';
}

\(D. Mishkin Energizer\)
\(非常简单的一道构造\)
\(可以发现如果存在两个不同的字母 那么必定可以通过将每个未达到n的个数的字母插入\)
\(最终对其实现满插 即为每个字母的个数都为n\)
\(因为数据范围很小 直接模拟即可\)
\(唯一有点困难的就是实现部分\)
\(如果使用string的substr可能会导致超时\)
\(如果我们巧妙地使用链表即可解决该问题\)

点击查看代码
const int N=1e5+10;
int nxt[N];
void solve() {int n;cin>>n;int top=n-1;string s;cin>>s;set<char>S;for (auto c:s)S.insert(c);if (s.size()==1||S.size()==1) {cout<<-1<<'\n';return;}int cnt0=0,cnt1=0,cnt2=0;for (int i=0;i<n;i++) {if (s[i]=='L')cnt0++;else if (s[i]=='I')cnt1++;else if (s[i]=='T')cnt2++;}// cout<<2*n<<'\n';nxt[n]=-1;vector<int>ans;for (int i=0;i<s.size()-1;i++) {nxt[i]=i+1;}int head=0;auto pd=[&](char a,char b) {if (a=='T'&&b=='I')return 'L';swap(a,b);if (a=='T'&&b=='I')return 'L';if (a=='I'&&b=='L')return 'T';swap(a,b);if (a=='I'&&b=='L')return 'T';if (a=='T'&&b=='L')return 'I';swap(a,b);if (a=='T'&&b=='L')return 'I';};auto cal=[&](char c) {if (c=='L')return cnt0;if (c=='I')return cnt1;if (c=='T')return cnt2;};auto insert=[&](int id,int now) {int Nxt=nxt[id];nxt[id]=now;nxt[now]=Nxt;};for (int i=0;i<2*n;i++) {int ok=0;int cnt=1;for (int id=head;id!=-1;id=nxt[id]) {if (s[nxt[id]]!=s[id]&&cal(pd(s[nxt[id]],s[id]))<n) {ok=1;s+=(pd(s[nxt[id]],s[id]));if (s.back()=='L')cnt0++;if (s.back()=='I')cnt1++;if (s.back()=='T')cnt2++;top++;insert(id,top);ans.pb(cnt);break;}cnt++;}if (ok==0) {cout<<-1<<'\n';return;}}cout<<2*n<<'\n';for (auto &son:ans) {cout<<son<<'\n';}
}
$E 十分困难的一道题 感觉达到了区域赛铜-银的难度 我将详细地讲解该题$

问题描述

给定一个 $ n \times m $ 的棋盘,所有单元格初始被涂成绿色。其中有 $ k $ 个单元格已经被预先涂成黑色(1)或白色(0)。现在需要将剩余的绿色单元格涂成黑色或白色,使得整个棋盘中相邻颜色不同的单元格对数为偶数。求满足条件的涂色方案数,并对 $ 10^9+7 $ 取模。


解题思路

1. 问题转换

棋盘上任意两个相邻单元格,若颜色不同,则记作 1。通过分析可以发现:

  • 棋盘内部单元格(非边界)的度数为偶数(如内部为 4,角落为 2),这些单元格对最终奇偶性没有影响。
  • 唯一起作用的是边界但不是角落的单元格(这些单元格的度数为奇数,通常是 3)。只有这些单元格会影响最后不同色对的奇偶性。

因此,我们将问题简化为:要求所有边界非角落单元格的颜色的 XOR 和为 0(即它们的 0/1 和模 2 为 0)。


2. 统计变量
  • 边界非角落单元格总数
    边界非角落单元格的数量为 $ T = 2(m-2) + 2(n-2) = 2(m+n-4) $。

  • 预涂色单元格统计
    在 $ k $ 个预涂色单元格中,统计位于边界非角落位置的数量 $ F_{\text{fixed}} $,以及它们的颜色 XOR 和 $ P $。

  • 自由涂色单元格统计

    • 边界非角落单元格中未被预涂色的数量为 $ F_{\text{free}} = T - F_{\text{fixed}} $。
    • 总共可以自由涂色的单元格数量为 $ \text{free_total} = n \times m - k $。

3. 方案计数
  • 对于非边界非角落的自由单元格
    这些单元格不影响奇偶性,每个都有 2 种涂法,总共贡献 $ 2^{\text{free_total} - F_{\text{free}}} $ 种方法。

  • 对于边界非角落的自由单元格
    如果有至少一个自由单元格(即 $ F_{\text{free}} > 0 $),那么在所有 $ 2^{F_{\text{free}}} $ 种涂法中,恰好一半可以使得整体边界 XOR 和为 0,也就是 $ 2^{F_{\text{free}}-1} $ 种方法。
    如果 $ F_{\text{free}} = 0 $(即所有边界非角落单元格都已经预涂),那么只有当预涂的这些单元格的 XOR 和 $ P = 0 $ 时,整体条件才能满足;否则答案为 0。
    可能有人会对为什么是颜色のXOR有疑问 那么首先想到如果所有位置的数都设置为0 那么总的可能一定是0 那么该种可能能够实现
    继续思考又因为中间和角落无论怎么修改都是偶数 无法对结果的奇偶造成影响所以无需考虑
    又因为位于边界非角落位置的数每次更改颜色 必定会引起奇偶的变化 所以他们的结果就必定为颜色的XOR和为0


4. 合并方案数
  • 当 $ F_{\text{free}} > 0 $ 时,总方法数为

    \[2^{(\text{free\_total} - F_{\text{free}})} \times 2^{F_{\text{free}}-1} = 2^{\text{free\_total} - 1}. \]

  • 当 $ F_{\text{free}} = 0 $ 时:

    • 若 $ P = 0 $ ,总方法数为 $ 2^{\text{free_total}} $(因为所有自由单元格都在非边界位置,可以任意涂色);
    • 否则答案为 0。

5. 快速幂算法

由于 $ \text{free_total} $ 的指数可能非常大,需要用快速幂算法对 $ 2^x $ 取模 $ 10^9+7 $。


实现代码

以下是基于上述思路的实现代码:

#include <bits/stdc++.h>
using namespace std;const int mod = 1e9 + 7;// 快速幂函数
long long qpow(long long a, long long b) {long long res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}void solve() {long long n, m, k;cin >> n >> m >> k;// 统计预涂色单元格的信息long long cnt_fixed = 0; // 预涂色的边界非角落单元格数量long long xor_sum = 0;   // 预涂色的边界非角落单元格的颜色 XOR 和for (int i = 0; i < k; i++) {long long x, y, c;cin >> x >> y >> c;// 判断是否为边界非角落单元格if ((x == 1 || x == n) ^ (y == 1 || y == m)) {cnt_fixed++;xor_sum ^= c;}}// 计算边界非角落单元格总数long long total_boundary = 2 * (m - 2) + 2 * (n - 2);// 计算自由涂色的边界非角落单元格数量long long free_boundary = total_boundary - cnt_fixed;// 总自由涂色单元格数量long long free_total = n * m - k;// 根据情况计算答案if (free_boundary > 0) {// 至少有一个自由边界单元格cout << qpow(2, free_total - 1) << '\n';} else {// 所有边界非角落单元格都已预涂色if (xor_sum == 0) {cout << qpow(2, free_total) << '\n';} else {cout << 0 << '\n';}}
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t;cin >> t;while (t--) solve();
}

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

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

相关文章

AMD GPU上对比语言图像预训练(CLIP)模型的交互(上)

AMD GPU上对比语言图像预训练(CLIP)模型的交互 3.1.1 介绍 对比语言图像预训练(CLIP)是一种连接视觉和自然语言的多模态深度学习模型。它是在OpenAI的论文从自然语言监督中学习可转移的视觉模型(2021)中介绍的,并在大量(4亿)图像字幕对的网络抓取数据上进行了对比训练…

推荐关注《AI芯片开发核心技术详解》(1)、《智能汽车传感器:原理设计应用》(2)、《TVM编译器原理与实践》(3)、《LLVM编译器原理与实践》(4),谢谢

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

惊!Docker Desktop竟然不会自动释放磁盘空间,C盘告急!

Docker Desktop竟然不会自动释放磁盘占用 > > 操作系统:Windows 11 家庭中文版 (23H2,22631.4037)16GB > > Docker Desktop 版本:v4.34.3 > 1. 缘起 docker pull docker-0.unsee.tech/savatar101/omniparse:0.1 拉取镜像,某个片段卡住,我主动取消了改操…

深入掌握FastAPI与OpenAPI规范的高级适配技巧

title: 深入掌握FastAPI与OpenAPI规范的高级适配技巧 date: 2025/03/30 01:16:11 updated: 2025/03/30 01:16:11 author: cmdragon excerpt: OpenAPI规范是RESTful API的标准描述格式,FastAPI通过自动化Schema生成机制将Pydantic模型和路径操作转换为标准OpenAPI文档,实现实…

‌Docker Desktop启动后自动加载Ubuntu WSL,docker-desktop-data WSL消失问题解析

‌Docker Desktop启动后自动加载Ubuntu WSL,docker-desktop-data WSL消失问题解析操作系统:Windows 11 家庭中文版 (23H2,22631.4037)16GB Docker Desktop 版本:v4.34.3如果赶时间,可以直接看结论。 Docker Desktop用的频次不是很高,记得之前安装完,用wsl --list -v命…

Prometheus的标签管理

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.标签概述1.什么是标签2.标签主要有两种表现形式3.Prometheus对数据处理的流程二.relabel_configs修改target标签案例1.为targets自定义打标签案例2.使用target_label新增标签2.relabel_configs替换标签…

极速启动,SAE 弹性加速全面解读

本文将深入探讨 SAE 如何通过镜像加速、应用启动加速、CPU Burst 等核心技术手段,实现极速启动与高效运行,帮助用户构建更加稳定、高效的云端应用。作者:牛通(奇卫) 在当今快速发展的云计算时代,业务的稳定性和响应速度成为了企业竞争力的重要标志。无论是应对突发流量还…

Redis缓存穿透、击穿与雪崩:问题分析与解决方案

在现代高并发系统中,Redis作为缓存层被广泛使用,其高效的读写性能为系统提供了强大的支持。然而,在使用Redis缓存的过程中,缓存穿透、击穿和雪崩等问题可能会对系统造成严重影响。本文将围绕这些问题展开讨论,并结合Redis的特性提出具体的解决方案。 一、Redis缓存穿透:如…

java - 使用OpenCV + Tesseract识别图片验证码

java - 使用OpenCV + Tesseract识别图片验证码tesseract tesseract-ocr/tesseract: 是一个开源的光学字符识别(OCR)引擎,适用于从图像中提取和识别文本。特点是可以识别多种语言,具有较高的识别准确率,并且支持命令行和API调用。项目地址:https://gitcode.com/gh_mirror…

【笔记】力扣 2316. 统计无向图中无法互相到达点对数——并查集, + 一种巧妙的求两两相乘之和的方法

2316. 统计无向图中无法互相到达点对数 中等 提示 给你一个整数 n ,表示一张 无向图 中有 n 个节点,编号为 0 到 n - 1 。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] 表示节点 ai 和 bi 之间有一条 无向 边。 请你返回 无法互相到达 的不同 点对数目 。 示例…

APT Package Manager

from pixivWhat is APT? Anatomy of the Package System(软件包系统剖析), is the Debian packaging system, 用于管理软件包,可以将其想象成命令行版的App Store.Debian 是一个自由且开源的 Linux 发行版,Ubuntu 是基于 Debian 构建的 Linux 发行版。它由 Canonical 公司…

22.1-任务的状态 第22章-FreeRTOS项目实战--任务的创建与执行 FreeRTOS 项目 FreeRTOS学习笔记 FreeRTOS移植 FreeRTOS开源项目 FreeRTOS面试题汇

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里: https://www.bilibili.com/video/BV16x4y1M7EN/?share_source=copy_web&vd_source=f5d5850ab773377dff308188468fbc77 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式…