当前位置: 首页 > news >正文

AtCoder Beginner Contest 405(CD)

C - Sum of Product

翻译:

        给你一个长为N的序列A=(A_1,A_2,...,A_N)

        计算\sum\limits_{1\leq i <j\leq N} A_iA_j的值。

思路:

        \sum\limits_{1\leq i <j\leq N} A_iA_j = \sum\limits_{i=1}^{N}(A_i*\sum\limits^N_{j=i+1}A_j) = \sum\limits_{i=1}^{N}(A_i*sum_{i+1,j})可使用前缀和快速得到区间和,在遍历 i 即可。(前缀和)

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MX = 2e5+10;void solve(){ll n;cin>>n;vector<ll> a(n+1),pre(n+1,0);for (int i=1;i<=n;i++){cin>>a[i];pre[i]+=pre[i-1]+a[i];}ll ans = 0;for (int i=1;i<=n;i++) ans+=a[i]*(pre[n]-pre[i]);cout<<ans<<endl;
}int main(){// 关闭输入输出流同步ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 不使用科学计数法// cout<<fixed;// 四舍五入中间填保留几位小数,不填默认// cout.precision();solve();return 0;
}



D - Escape Route

翻译:

        给你一个 H 行 W 列的网格。让 (i,j) 表示从上往下第 i 行和从左往右第 j 列的单元格。
        每个单元格由以下字符之一表示 S_{i,j}

  • . :走廊单元格
  • #:墙壁单元
  • E:紧急出口

        对于任何一个走廊单元 (i,j),定义 d(i,j) 即到最近的紧急出口的距离如下:

  • 从 (i,j)开始,沿四个基本方向(上、下、左、右)之一重复移动到相邻的非墙壁单元,直到到达紧急出口。d(i,j) 是所需的最少移动次数。

        可以保证 d(i,j) 对于给定网格中的每个走廊单元都是可定义的;也就是说,每个走廊单元 (i,j) 至少有一个紧急出口可以通过走廊单元到达。

        在每个走廊单元写一个箭头(向上、向下、向左或向右),使以下条件成立:

  • 对于每个走廊单元 (i,j),如果从 (i,j) 开始执行以下操作 d(i,j)次,就会到达一个紧急出口:
    • 按照当前单元格中箭头的方向移动一个单元格。(不能移动到墙壁单元格或网格外)。

思路:

        从每个E出发进行广度搜索,并记录到达走廊的步数,如果更小则更新到该点步数和箭头。(dfs)

实现:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int MX = 2e5+10;
struct Edge{int x,y;char d;
};
vector<Edge> direct;
void solve(){int n,m;cin>>n>>m;vector<vector<char>> grid(n+1,vector<char>(m+1));vector<vector<int>> vis(n+1,vector<int>(m+1,INT_MAX));queue<array<int,3>> pq;for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){cin>>grid[i][j];if (grid[i][j]=='E'){vis[i][j] = 0;pq.push({0,i,j});}}}vector<vector<char>> ans(grid.begin(),grid.end());while (!pq.empty()){int now_x = pq.front()[1],now_y = pq.front()[2],step = pq.front()[0];pq.pop();for (auto& [xx,yy,d]:direct){int tmp_x = now_x+xx,tmp_y = now_y+yy;if (tmp_x>=1 && tmp_x<=n && tmp_y>=1 && tmp_y<=m && grid[tmp_x][tmp_y]=='.' && vis[tmp_x][tmp_y]>step+1){vis[tmp_x][tmp_y] = step+1;ans[tmp_x][tmp_y] = d;pq.push({step+1,tmp_x,tmp_y});}}}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){cout<<ans[i][j];}cout<<'\n';}
}int main(){// 关闭输入输出流同步ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// 不使用科学计数法// cout<<fixed;// 四舍五入中间填保留几位小数,不填默认// cout.precision();direct.push_back({1,0,'^'});direct.push_back({-1,0,'v'});direct.push_back({0,1,'<'});direct.push_back({0,-1,'>'});solve();return 0;
}


 

之后补题会在此增加题解。    

E题,想的动态规划,单看数据的大小搞不出来,如果有相关思路感谢告知T_T。

atcoder前两题的题解就算了,应该也没人想看吧。。。

相关文章:

  • Qt中在子线程中刷新UI的方法
  • Day28 -js开发01 -JS三个实例:文件上传 登录验证 购物商城 ---逻辑漏洞复现 及 判断js的payload思路
  • MySQL:视图
  • 前端弹性布局:用Flexbox构建现代网页的魔法指南
  • Linux 离线安装 Docker 和 Docker Compose 最新版 的完整指南
  • 微机控制电子式持久蠕变慢应变应力腐蚀试验机
  • MATLAB安装常见问题及解决方案详解(含代码示例)
  • 在 Kubernetes 中使用 Docker 实现 GPU 支持的完整方案
  • Android 13 使能user版本进recovery
  • 智能商品推荐系统技术路线图
  • Python与C语言的区别
  • stm32 lcd绘制波形和频谱
  • 数仓-缓慢变化维是什么,如何解决
  • 双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型
  • 【LangChain全景指南】构建下一代AI应用的开发框架
  • linux中常用的命令(三)
  • Docker镜像搬运工:save与load命令的实战指南
  • 软考 系统架构设计师系列知识点之杂项集萃(55)
  • 大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调
  • linux搭建hadoop学习
  • 国际足联女子世界杯再次扩军,2031年起增至48支球队
  • 欧洲理事会前主席米歇尔受聘中欧国际工商学院特聘教授,上海市市长龚正会见
  • 《中国人民银行业务领域数据安全管理办法》发布,6月30日起施行
  • 数理+AI+工程,上海交大将开首届“笛卡尔班”招生约20名
  • 山寨“小米”智能马桶、花洒销售额过亿,被判赔3500万元
  • 调节负面情绪可以缓解慢性疼痛