AtCoder Beginner Contest 370 补题记录
A - Raise Both Hands
题意:
给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid
思路:
- 举左手:
(l == 1 && r == 0) - 举右手:
(l == 1 && r == 0) - 其他情况都是
Invalid
void solve()
{
int l = read(), r = read();
if(l == 1 && r == 0){
cout<<"Yes"<<endl;
}else if(l == 0 && r == 1){
cout<<"No"<<endl;
}else {
cout<<"Invalid"<<endl;
}
}
B - Binary Alchemy
题意:
有 \(N\) 种编号为 \(1, 2, \ldots, N\) 的元素。
元素之间可以相互组合。当元素 \(i\) 和 \(j\) 组合在一起时,如果 \(i \geq j\) 变为元素 \(A_{i, j}\) ,如果 \(i < j\) 变为元素 \(A_{j, i}\) 。
从元素 \(1\) 开始,依次与元素 \(1, 2, \ldots, N\) 结合。求最后得到的元素。
思路:
根据题意,模拟查表,逐一合成即可
void solve()
{
int n = read();
int a[N][N];
for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) a[i][j] = read();
int x = 1;
for(int t=1;t<=n;t++){
int i = max(x,t) , j = min(x,t);
x = a[i][j];
}
cout<<x<<endl;
}
C - Word Ladder
题意:
给定两个长度相等的字符串 \(S\) 和 \(T\),
用最小的操作次数,使得 \(S = T\) ,并且字符串 \(X\) 的字典序最小。
操作为,选择 \(S_i = c\) ,并且将修改后的 \(S\) 放入 \(X\) 的末尾。
思路:
- 显然S和T有多少个不同的字符就操作多少次就是次数最少
- 考虑使X的字典序最小,在S中修改字符,越靠前并且越小的字符应该越靠后修改
- 故两次遍历S,先从前往后遍历,若\(S_i < T_i\)则操作一次
- 再从后往前遍历,将剩下不一样的字符修改掉
void solve()
{
string s1 = sread(), s2 = sread();
int n = s1.length();
vector<string> ans;
for(int i=0;i<n;i++){
if(s1[i] > s2[i]){
s1[i] = s2[i];
ans.push_back(s1);
}
}
for(int i=n-1;i>=0;i--){
if(s1[i]!=s2[i]){
s1[i] = s2[i];
ans.push_back(s1);
}
}
cout<<ans.size()<<endl;
for(auto it:ans) cout<<it<<endl;
}
D - Cross Explosion
题意:
\(H \times W\) 的二维网格,初始所有格子都有墙
\(Q\) 次操作,每次操作都在\((x , y)\)处放一炸弹
- 若\((x , y)\)没有墙,则炸毁墙
- 若\((x , y)\)有墙,则分别炸毁上下左右的最近的第一面墙
思路:
对于每一个坐标\((x , y)\),可以分成行和列来考虑
- 在第x行中,可以用二分查找找到第一个坐标大于等于y的墙
- 在第y列中,可以用二分查找找到第一个坐标大于等于x的墙
因此,我们需要一个 既能二分查找,也能插入,删除的容器
显然只有 STL::set 能够满足
将行和列分别建立set数组,每次操作在行和列都执行即可
void solve()
{
string s1 = sread(), s2 = sread();
int n = s1.length();
vector<string> ans;
for(int i=0;i<n;i++){
if(s1[i] > s2[i]){
s1[i] = s2[i];
ans.push_back(s1);
}
}
for(int i=n-1;i>=0;i--){
if(s1[i]!=s2[i]){
s1[i] = s2[i];
ans.push_back(s1);
}
}
cout<<ans.size()<<endl;
for(auto it:ans) cout<<it<<endl;
}
E - Avoid K Partition
题意:
给定一个数组 \(A\),划分成若干个子区间,使得没有子区间的和为 \(K\)
求划分方案数
思路:
涉及到子区间的和,显然要用到前缀和来优化,预处理一个前缀和数组 pre[N]
- 线性DP: (会TLE)
设 \(f_i\) 表示当前枚举到的连续子序列以 \(i\) 结尾的不同方案数- \(i\) 从1到n遍历
- \(j\) 从0到i-1,pre[i] - pre[j] 即为最后一个子序列的和,若该值不等于K,则将该划分方案加入到 f[i]中
void solve()
{
int n = read(), k = read();
const int mod = 998244353;
vector<int> v(1);
for(int i=1; i<=n; i++) v.push_back(read());
vector<int> f(n+1),pre(n+1);
for(int i=1;i<=n;i++){
pre[i] = v[i] + pre[i-1];
}
f[0] = 1;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(pre[j] != pre[i] - k){
f[i] = (f[i] + f[j])%mod;
}
}
}
cout<<f[n]<<endl;
}
- 考虑优化,pre[j] 只要不等于 pre[i] - k 即可,因此不需要遍历每个子区间,只需要在所有方案的和中减去子区间和是k的方案即可
- 用map来存储不同子区间和的方案的个数,即pre[i]的方案个数(方案个数就是符合条件的f[i]的值)
- 用sum来记录所有子序列的划分方案的和
void solve()
{
int n = read(), k = read();
vector<int> v(1);
for(int i=0;i<n;i++) v.push_back(read());
const int mod = 998244353;
vector<int> pre(n+1),f(n+1);
unordered_map<int,int> cnt;
for(int i=1;i<=n;i++) pre[i] = pre[i-1] + v[i];
f[0] = 1;
cnt[0] = 1;
int sum = 1;
for(int i=1;i<=n;i++){
f[i] = sum - cnt[pre[i] - k];
f[i]%=mod, f[i]+=mod, f[i]%=mod;
sum = (sum+f[i])%mod;
cnt[pre[i]] += f[i];
}
cout<<f[n]<<endl;
}
- 注意到:若没有和为 \(K\) 的条件,长度为n的数组划分方案的个数为2的n次方
AtCoder Beginner Contest 370 补题记录的更多相关文章
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Regular Contest 151补题
AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...
- Yahoo Programming Contest 2019 补题记录(DEF)
D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...
- AtCoder Beginner Contest 069 ABCD题
题目链接:http://abc069.contest.atcoder.jp/assignments A - K-City Time limit : 2sec / Memory limit : 256M ...
- AtCoder Beginner Contest 050 ABC题
A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...
- AtCoder Beginner Contest 070 ABCD题
题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...
- AtCoder Beginner Contest 051 ABCD题
A - Haiku Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement As a New Yea ...
- AtCoder Beginner Contest 057 ABCD题
A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
随机推荐
- Kettle - 简介
ETL简介 Kettle简介 transformation 和 job的区别 Kettle 的核心组件 Kettle 特点 Kettle 的目录说明 Kettle 的文件说明 ETL简介 ETL,Ex ...
- FastAPI路由与请求处理全解:手把手打造用户管理系统 🔌
title: FastAPI路由与请求处理全解:手把手打造用户管理系统 date: 2025/3/2 updated: 2025/3/2 author: cmdragon excerpt: 通过咖啡店 ...
- 万字解析Golang的map实现原理
0.引言 相信大家对Map这个数据结构都不陌生,像C++的map.Java的HashMap.各个语言的底层实现各有不同,在本篇博客中,我将分享个人对Go的map实现的理解,以及深入源码进行分析,相信耐 ...
- 解决 Ubuntu 22.04 下 flameshot 截图工具无法使用的问题
问题描述 flameshot 是 Linux 端广受好评的一款截图工具,但在 Ubuntu 22.04 中,安装完成后却不能使用,表现为截图命令无响应,或截图过程报错. 通过查阅 flameshot ...
- Unable to Connect: sPort: 0 C# ServiceStack.Redis 访问 redis
需求: 对数据库中的不断抓取的文章进行缓存,因此需要定时访问数据,写入缓存中 在捕获到的异常日志发现错误:Unable to Connect: sPort: 0 使用的访问方式是线程池的方式:Poo ...
- WARN Issues with peer dependencies found,pnpm peer dependencies auto-install
前言 pnpm 也需要设置自动安装对等依赖项 解决 pnpm 使用 npm 的配置格式,所以应该以与 npm 相同的方式设置配置: pnpm config set auto-install-peers ...
- 【SqlServer】datetime存储精度问题探究
最近使用sqlserver 2012的时候注意到datetime类型的毫秒的精度是存在问题的,好奇是怎么回事,特意来研究一下 问题复现 如下的sql执行 UPDATE AlarmItem SET cr ...
- Oracle12c 数据库 警告日志
目录 一:查看警告日志文件的位置 二:警告日志内容 三:告警日志监控: 方案1: 方案2: 方案3: 正文 回到顶部 一:查看警告日志文件的位置 Oracle 12c环境下查询,alert日志并不在b ...
- WEBGL 笔记
目录 前言 h2 { text-align: center } 前言 WebGL 是一个在浏览器里使用的高效渲染二维和三维图形的 javascript API,于 2006 年起源,该技术基于 Ope ...
- 【C语言】解决初始化数组时报错“undefined reference to `memcpy'”
[C语言]解决初始化数组时报错"undefined reference to `memcpy'" 零.报错 代码: char start[] = {0xd, 0xa, 0xb3, ...