AtCoder Beginner Contest 371

news/2024/9/19 9:23:00/文章来源:https://www.cnblogs.com/zhouruoheng/p/18414725

ABC371总结

一些废话

想着以后换一种方式写总结,不再以那种题解形式,写起来又累又难写,只对其中部分有意思的题目写出完整的题解。就是以随笔的形式,在打完比赛后写出自己的一些感悟,每道题做的过程中的一些思路、用时和需要改进的地方,就是类似随笔之类的,随便写写。

A

用时:8分37秒

很基础的语法题,可是我当场降智,正解应该是判断 \(a,b,c\),中是否满足第二大,我竟然直接对其大小情况进行枚举然后判断是否合法再输出第二大,硬是搞了 \(8\) 分钟

赛时code

#include <bits/stdc++.h>
using namespace std;int main ()
{char a,b,c;int x,y,z;cin>>a>>b>>c;for(int x=1;x<=3;x++)for(int y=1;y<=3;y++)for(int z=1;z<=3;z++) {if(x!=y&&y!=z&&x!=z){if(a=='<') if(x>y) continue;if(a=='>') if(x<y) continue;if(b=='<') if(x>z) continue;if(b=='>') if(x<z) continue;if(c=='<') if(y>z) continue;if(c=='>') if(y<z) continue;if(x==2) cout<<'A'<<"\n";if(y==2) cout<<'B'<<"\n";if(z==2) cout<<'C'<<"\n";return 0;}}return 0;
}

code


B

这就没啥好说的了,记录下长子是谁,判断一下就好了。

用时:4分57秒

code

#include <bits/stdc++.h>
using namespace std;const int N=105;
int n,m;
int st[N];
int ans[N];int main ()
{cin>>n>>m;for(int i=1;i<=m;i++){int id;char c;cin>>id>>c;st[i]=id;if(c=='F') continue;if(ans[id]==0) ans[id]=i;}for(int i=1;i<=m;i++) {if(ans[st[i]]==i)  cout<<"Yes\n";else cout<<"No\n";}return 0;
}

C

用时:22分03秒

一开始是没想出来的,后面写完 \(D\) 回来看到数据范围,\(n\) 特别小,就想到枚举 \(p\) 的全排列,再进行统计。双向的问题还搞了我一会。

code

#include <bits/stdc++.h>
using namespace std;
const int N=10;
int n;
int m1,m2;
int p[N];
int g[N][N],h[N][N],a[N][N];
int ans=0x3f3f3f3f;
int main ()
{cin>>n;cin>>m1;for(int i=1;i<=m1;i++){int x,y;cin>>x>>y;g[x][y]=g[y][x]=1;}cin>>m2;for(int i=1;i<=m2;i++){int x,y;cin>>x>>y;h[x][y]=h[y][x]=1;}for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)cin>>a[i][j],a[j][i]=a[i][j];for(int i=1;i<=n;i++) p[i]=i;do{int cnt=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++){int x=p[i],y=p[j];if(g[i][j]!=h[x][y]) cnt+=a[x][y];}ans=min(ans,cnt);}while(next_permutation(p+1,p+n+1));cout<<ans<<"\n";return 0;
}

D

用时:20分18秒

没啥好说的,简单的离散化加前缀和。一开始我空间开小了,吃了一次罚时。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
int n,q;
int p[N];
int b[N*3];
int tot;
ll a[N],c[N];
int l[N],r[N];int main ()
{cin>>n;for(int i=1;i<=n;i++) cin>>p[i],b[++tot]=p[i];for(int i=1;i<=n;i++) cin>>a[i];cin>>q;for(int i=1;i<=q;i++){cin>>l[i]>>r[i];b[++tot]=l[i];b[++tot]=r[i];}sort(b+1,b+tot+1);tot=unique(b+1,b+tot+1)-b-1;for(int i=1;i<=n;i++){int id=lower_bound(b+1,b+tot+1,p[i])-b;c[id]=a[i];}for(int i=1;i<=tot;i++) c[i]+=c[i-1];for(int i=1;i<=q;i++){int x=lower_bound(b+1,b+tot+1,l[i])-b;int y=lower_bound(b+1,b+tot+1,r[i])-b;cout<<c[y]-c[x-1]<<"\n";}return 0;
}

E

用时:35分51秒

也是一开始没有思路,瞪了十分钟 \(F\) 以后回来想,不能 \(n^2\),考虑前缀和思想。整体考虑 \(sum_i\) 表示以 \(i\) 作为左端点的所有子序列产生的贡献。从 \(sum_1\) 开始,依次考虑每次删去第一个数后 \(sum\) 如何变化。
考虑子序列 \([i,r]\),删去 \(i\) 后,什么情况下才能使该子序列不同元素的个数减一?
当然是当后面没有 \(a_i\) 的情况下。也就是说我们要找到最大的 \(r\) 使 \([i+1,r]\) 中没有 \(a_i\),比他小的子序列如果还有元素的话就都应该减一。
因此按元素记录下所有元素所出现的位置,每次找到下一个 \(a_i\) 出现的位置,再对 \(sum\) 进行更新。

code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n;
int a[N],b[N],c[N];
vector<int> g[N];
int v[N];
ll ans,sum;
int main ()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) {g[a[i]].push_back(i);b[i]=b[i-1];if(c[a[i]]==0) b[i]++;c[a[i]]++;sum+=b[i];}for(int i=1;i<=n;i++) g[i].push_back(n+1);ans+=sum;for(int i=1;i<n;i++){int id=g[a[i]][++v[a[i]]];sum-=(id-i);ans+=sum;}cout<<ans<<"\n";return 0;
}

剩下的就等补完题再写了。

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

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

相关文章

第二十讲:为什么我只改一行的语句,锁这么多?

该文章深刻揭示了一点:加索引=行锁+间隙锁=(next-key lock),分析了加锁的规则:对主键(唯一索引),普通非唯一索引进行等值与范围查询的加锁。这篇文章我认为收获最大的是让我们知道“明明对一行加了锁,为什么在他相邻部分,或是相相邻部分无法插入数据(这根主键类型,…

【视频讲解】线性时间序列原理及混合ARIMA-LSTM神经网络模型预测股票收盘价研究实例

原文链接:https://tecdat.cn/?p=37702 原文出处:拓端数据部落公众号 分析师:Dongzhi Zhang 近年来人工神经网络被学者们应用十分广泛,预测领域随着神经网络的引入得到了很大的发展。本文认为单一神经网络模型对序列所包含的线性信息和非线性信息的挖掘是有限的,因此本…

Docker-Compose搭建RustDesk服务器

前置条件:电脑安装RustDesk客户端,服务器安装Docker及docker-compose官方文档:安装 :: RustDesk文档操作流程:使用Vim编写docker-compose.yml文件,修改需要的端口,最好按照官方对应的端口来操作,< >内替换成服务器对外的端口。记住挂载文件路径,容器运行后会生成密…

CMake构建学习笔记16-使用VS进行CMake项目的开发

详细介绍了通过Visual Studio 2019 这款IDE进行CMake项目开发过程,能够极大增加C/C++程序的开发效率。目录1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行3. 项目案例4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第三方的依赖库,也…

USB总线-Linux内核USB3.0主机控制器驱动初始化流程分析(十三)

1.概述 RK3588有2个USB3.0 DRD控制器,2个USB2.0 Host控制器。USB3.0 DRD控制器既可以做Host,也可以做Device,向下兼容USB2.0和USB1.0。USB3.0 DRD控制器的内部结构如下图所示;总线接口为AXI或AHB;USB3.0和USB2.0及USB1.0硬件上独立;USB3.0控制器数字逻辑部分对应SS MAC,…

作业2:个人项目

个人项目-论文查重 一、课程信息这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 熟悉软件开发以及工具的使用、算法的设计、资料的搜集GitHub地址 二、开发环境开发工具 IDEA 2021.3.2项目构建工具 maven单元测试 Junit分词依赖包 hanlp三、…

Linkedin-SRE-中文教程-二-

Linkedin SRE 中文教程(二)原文:School of SRE 协议:CC BY-NC-SA 4.0一些 Python 概念原文:https://linkedin.github.io/school-of-sre/level101/python_web/python-concepts/虽然期望您了解 python 及其基本语法,但是让我们讨论一些基本概念,这将帮助您更好地理解 pyth…

分析负数取模与取余的规则

目录负数"取模"基本概念修正定义取整规则决定商的值取模和取余不一样. 负数"取模"基本概念如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r,且0 <= r < d。其中,q 被称为商,r 被称为余数。 //对应代码 int mai…

Openwrt挂载大容量NTFS磁盘,解决默认挂载不能写入问题,实现samba共享

1. 目的 在OpenWRT上挂载上大容量磁盘(NTFS文件系统),支持读写操作。解决默认挂载仅能读取,不能写入问题。 配置Samba36,实现局域网文件夹共享。 2. 环境架构 ARMv7 Processor rev 1 (v7l)固件版本 OpenWrt 19.07.7内核版本 3.10.33安装插件smbd -v # 检查是否安装了smb …

使用MySQL Workbench进行数据库备份

1、打开MySQL Workbench2、进行数据库连接配置 如果之前连过,会有历史记录,直接点击需要备份的连接即可3、进入主界面后,选择左侧的Administration选项卡,然后点击Data Export;或者点击工具栏的Server——Data Export4、选择要备份的数据库,默认选择所有的表,在objects …

Mininet安装记录

安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1、更改软件镜像源 在设置中进行如下操作:选择国内的镜像站点,如阿里云。 点击关闭后,在弹出的窗口中点击重新载入,等待缓存更新完成。2、下载git 在终端中执行如下命令: sudo apt-get install git没有报错的话,…

Redis运维之监控指标,性能监控,监控方式,响应慢分析

目录1 Redis监控1.1 Redis监控指标1.1.1 性能指标: Performance1.1.2 内存指标: Memory1.1.3 基本活动指标:Basic activity1.1.4 持久性指标: Persistence1.1.5 错误指标:Error1.2 监控方式1.2.1 info1.2.2 性能监控1.2.3 内存监控1.2.4 基本活动指标1.2.5 持久性指标1.2.6 错…