AtCoder Beginner Contest 378 题解

news/2024/11/14 8:36:47/文章来源:https://www.cnblogs.com/showball/p/18542511

AtCoder Beginner Contest 378 题解

比赛链接

A - Pairing 贪心

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){vector<int> a(5);for(int i=0;i<4;i++){int x;cin>>x;a[x]++;}int cnt=0;for(int i=1;i<=4;i++) cnt+=a[i]/2;cout<<cnt<<"\n";
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

B - Garbage Collection

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){int n;cin>>n;vector<int> q(n),r(n);for(int i=0;i<n;i++){cin>>q[i]>>r[i];}int m;cin>>m;while(m--){int x,d;cin>>x>>d;x--;cout<<d+(q[x]+r[x]-d%q[x])%q[x]<<"\n";}
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

C - Repeating

使用 map 开个桶记录一下每个数上次出现的位置即可。

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){int n;cin>>n;vector<int> a(n);for(int i=0;i<n;i++){cin>>a[i];}map<int,int> mp;for(int i=0;i<n;i++){if(!mp[a[i]]) cout<<"-1 ";else cout<<mp[a[i]]<<" ";mp[a[i]]=i+1;}
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

D - Count Simple Paths 深搜

数据范围很小,直接枚举每个点,然后从每个点开始深搜即可。标准的深搜,写法比较套路。注意 st数组的更新。

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){int h,w,k;cin>>h>>w>>k;vector<string> a(h);for(int i=0;i<h;i++){cin>>a[i];}vector<vector<int>> st(h,vector<int>(w));auto check=[&](int x,int y){return (0<=x&&x<h&&0<=y&&y<w&&a[x][y]=='.'&&!st[x][y]);};const int dx[]={1,-1,0,0};const int dy[]={0,0,1,-1};int ans=0;function<void(int,int,int)> dfs=[&](int x,int y,int cnt){if(cnt>=k){ans++;return;}for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(check(xx,yy)){st[xx][yy]=1;dfs(xx,yy,cnt+1);st[xx][yy]=0;}}};for(int i=0;i<h;i++){for(int j=0;j<w;j++){if(a[i][j]=='.') {st[i][j]=1;dfs(i,j,0);st[i][j]=0;}}}cout<<ans<<"\n";
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

E - Mod Sigma Problem 思维

如果两层都要取模,那就非常简单,只有一层,我们先不管取模尝试化简这个式子。

考虑使用前缀和,原式 = $\sum_{1\le l,r \le N} ({S_r-S_{l-1}}) $ 。

继续化简: \(\sum_{1\le i \le N} \sum_{1\le j \le i} ({S_i-S_{j-1}})\) = \(\sum_{1\le i \le N} \sum_{1\le j \le i-1} ({S_i-S_{j}})\)

\(S_i\) 拿出来,即:\(\sum_{1\le i \le N} ({i*S_i-\sum_{1\le j\le i-1}S_{j}})\)

式子被我们化成了差的形式,因此,如果 \(S_i < S_j\) 那么结果就会变成负数,因此我们就需要加上一个 \(m\)

考虑如何快速统计需要增加的 \(m\) 的数量。发现问题转化为求在 \(s_i\) 之前有多少个数比它大。

其实就是经典的逆序对问题,使用归并排序或者树状数组即可解决。

这里采用树状数组,注意,这里的数组值要对 \(m\) 取模,值可能为 \(0\),因此,使用权值树状数组时,可能会 TLE

所以,我们只需要偏移一位下标即可。

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){int n,m;cin>>n>>m;vector<i64> a(n+1),s(n+1);for(int i=1;i<=n;i++){cin>>a[i];s[i]=(s[i-1]+a[i])%m;}vector<i64> tr(m+2);auto add=[&](int x){for(;x<=m;x+=x&-x) tr[x]++;};auto getsum=[&](int x){i64 ret=0;for(;x;x-=x&-x) ret+=tr[x];return ret;};i64 tot=0,res=0;for(int i=1;i<=n;i++){res+=i*s[i]-tot;tot+=s[i];res+=1LL*m*(getsum(m)-getsum(s[i]+1));add(s[i]+1);}cout<<res<<"\n";
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

F - Add One Edge 2 图论

要构成满足条件的环,我们只需要首尾点的度数为 \(2\) , 中间点的度数为 \(3\) 即可。发现度数为 \(3\) 的点组成的联通块周围的度数为 \(2\) 的点两两都是可达的。

那么我们只需要维护出每个点周围有多少个度数为 \(2\) 的点,然后乘法原理即可。最后 \(BFS\) 统计一下答案即可。

#include<bits/stdc++.h>using namespace std;using i64=long long;void Showball(){int n;cin>>n;vector<vector<int>> e(n);vector<int> d(n);for(int i=1;i<n;i++){int u,v;cin>>u>>v;u--,v--;e[u].push_back(v);e[v].push_back(u);d[u]++;d[v]++;} vector<int> w(n);function<void(int,int)> dfs=[&](int u,int fa){for(auto v:e[u]){w[u]+=(d[v]==2);if(v==fa) continue;dfs(v,u);}};auto bfs=[&](int st){int ret=0;queue<int> q;q.push(st);while(!q.empty()){int u=q.front();q.pop();ret+=w[u];d[u]=0;for(auto v:e[u]){if(d[v]!=3) continue;q.push(v);}}return ret;};dfs(0,-1);i64 ans=0;for(int i=0;i<n;i++){if(d[i]==3){int t=bfs(i);ans+=1LL*t*(t-1)/2;}}cout<<ans<<"\n";
}
int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int t=1;//cin>>t;while(t--){Showball();}return 0;
}

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

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

相关文章

《会计原来这么有趣》——中级实务篇(刘海涛)

第一章:存货核算 1.1存货定义:存货是指企业在日常活动中持有以备出售的产成品或商品、处在生产过程中的在产品、在生产过程或提供劳务过程中耗用的材料或物料等,包括各类材料、在产品、半成品、产成品或库存商品以及包装物、低值易耗品、委托加工物资等。 参考(https://bai…

实验15:职责链模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式的动机,掌握该模式的结构; 2、能够利用职责链模式解决实际问题。[实验任务一]:财务审批 某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以…

题解:[JOISC 2021 Day4] イベント巡り 2 (Event Hopping 2)

P7562 [JOISC 2021 Day4] イベント巡り 2 (Event Hopping 2) lxl 上课讲了这题,我听了选取答案区间的思路,恍然大雾 ,于是就有了这篇题解—— sto lxl orz !!!本题解主要详解区间选取。 前置知识:倍增策略 首先,本题的 \(L_i\)、\(R_i\) 较大,离散化即可。 另外,我个…

团队作业4——项目冲刺-2

团队作业4——项目冲刺-2信息项 内容课程名称 广工计院计科34班软工作业要求位置 作业要求作业目标 小飞棍团队对需求改进和系统设计进行讨论GitHub链接 GitHub一、团队简介队名:小飞棍队团队成员:姓名 学号罗振烘(组长) 3122004748庄崇立 3122004633李响 3121002802何昌洲…

实验14:代理模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解代理模式的动机,掌握该模式的结构; 2、能够利用代理模式解决实际问题。[实验任务一]:婚介所 婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪…

Bulk-Crap-Uninstaller:一个高效卸载,轻松管理你的应用程序的.Net开源工具

我们在工作中,经常需要安装大量的软件,随着应用程序的不断增多,管理这些软件变得非常困难。 下面介绍一款具备高效、简洁的特点,可以帮助我们快速卸载大量不需要的应用程序,让电脑管理变得更加轻松。01 项目简介 Bulk-Crap-Uninstaller是一款开源的软件卸载工具,基于.Net…

绘制3D架构图,原来这么简单

在软件开发的世界里,架构图是系统设计的蓝图,它们不仅帮助团队理解系统的整体结构,还能提升沟通效率,确保项目的顺利推进。然而,绘制一张清晰、直观的架构图,往往需要大量时间和专业工具。面对繁琐的操作和复杂的学习曲线,不少程序员感到力不从心。 之前DD有给大家推荐过…

AI千恋万花(java调用api实现)附完整项目及注释)重置版)

感觉博客的第一版质量有点低下了,删了重置一下,希望能给其他人的代码带来一些灵感前情提要:https://www.cnblogs.com/h4o3/p/18523151 由于是匆忙制作的老婆系统,主界面已经菠萝菠萝哒。(有点廉价) 注册和登录功能用了MySQL实现(其实没什么卵用,为了顺手交个作业临时加…

鲲鹏V10安装人大金仓

1.下载人大金仓数据库 https://www.kingbase.com.cn/xzzx/index.htm 2.创建安装用户 useradd kingbase#将安装包权限赋予kingbase用户chown -R kingbase:kingbase /home/kingbase#创建安装目录并赋权mkdir -p /usr/local/apps/KingbaseESmkdir -p /usr/local/apps/Kingbasechow…

centos7安装elasticsearch:7.9.3

服务器安装elasticsearch:7.9.3 一、安装前准备检查系统环境:确保CentOS 7系统已经更新到最新版本。 检查系统的硬件资源,确保满足Elasticsearch的安装和运行要求。安装OpenJDK:Elasticsearch需要Java环境,这里选择安装OpenJDK 11。 使用命令sudo yum install java-11-open…

Golang 编译windows应用程序

因为我们更喜欢在Linux上开发程序, 所以生成交叉编译器,以便在Linux上交叉编译出windows程序。 安装minGW:在Linux上运行gcc交叉编译生成windows程序 我们用到Cgo,因此需要安装 C 语言交叉编译器 sudo apt-get install gcc-mingw-w64 下载Go语言的源代码 git clone https:/…

The platform metadata area could not be written: /Volumes/MemoryAnalyzer1/MemoryAnalyzer.app/Content

mac安装MAT报错:The platform metadata area could not be written: /Volumes/MemoryAnalyzer1/MemoryAnalyzer.app/Content 。。。。。解决:创建文件夹 /Users/mzj/storage/data/mat/data