ATCoder Beginner Contest 340 A~G

A.Arithmetic Progression(模拟)

题意:

输出首项为 a a a,末项为 b b b,公差为 d d d的等差数列。

分析:

按照要求模拟。

代码:

#include <bits/stdc++.h>using namespace std;int main() {int a, b, d;cin >> a >> b >> d;for (int i = a; i <= b; i += d) {cout << i << " ";}return 0;
}

B.Langton’s Takahashi(模拟)

题意:

给定一个空的序列, q q q次询问。有以下两种操作:

  • 序列末尾加入一个新元素 x x x
  • 询问从末尾开始往前数第 k k k个元素是多少。

分析:

v e c t o r vector vector模拟即可。

代码:

#include <bits/stdc++.h>using namespace std;
vector<int> a;int main() {int q;cin >> q;for (int i = 1; i <= q; i++) {int op, x;cin >> op >> x;if (op == 1) {a.push_back(x);} else {cout << a[a.size() - x] << endl;}}return 0;
}

C.Divide and Divide(dfs)

题意:

黑板上有一个整数 n n n,执行以下操作,直到所有不小于 2 2 2的整数都从黑板上移除。

  • 选择写在黑板上的一个不小于 2 2 2的整数 x x x
  • 移除 x x x,并在黑板上写下 ⌊ x / 2 ⌋ \lfloor x /2 \rfloor x/2 , ⌈ x / 2 ⌉ \lceil x/2 \rceil x/2
  • 支付 x x x元来完成操作。

询问所有操作结束后,需要支付多少元。可以证明,无论操作的顺序如何,支付的总金额是不变的。

分析:

按照要求分为向下取整和向上取整两种搜索方向进行记忆化搜索即可。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
map<LL, LL> dp;LL dfs(LL x) {if (x == 2) {return dp[x] = 2;}if (x == 1) {return dp[x] = 0;}if (dp.count(x)) {return dp[x];}return dp[x] = (x + 1) / 2 + x / 2 + dfs((x + 1) / 2) + dfs(x / 2);
}int main() {LL n;cin >> n;cout << dfs(n) << endl;return 0;
}

D Super Takahashi Bros.(最短路)

题意:

有一个闯关游戏由 n n n个关卡组成,最初玩家停留在关卡 1 1 1
对于每一个关卡 i ( 1 ≤ i ≤ n − 1 ) i (1 \le i \le n-1) i(1in1)可以执行以下两个操作中的一个:

  • 花费 a i a_i ai的时间,攻克关卡 i i i,进入 i + 1 i+1 i+1
  • 花费 b i b_i bi的时间,攻克关卡 i i i,进入 x i x_i xi

询问至少需要多少时间可以通过通关。

分析:

最短路建边。每个点 i i i i + 1 i+1 i+1连一条代价为 a i a_i ai的边,向 x i x_i xi连一条代价为 b i b_i bi的边,跑最短路即可。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 5;
LL a[MAXN], b[MAXN], x[MAXN];
LL vis[MAXN], dis[MAXN];
priority_queue<pair<LL, LL>> q;
const LL INF = 1e18;
int n;void dijkstra() {dis[n] = INF;dis[1] = 0;q.push(make_pair(-dis[1], 1));while (q.size() > 0) {int u = q.top().second;q.pop();if (vis[u] == 1)continue;vis[u] = 1;if (u < n) {if (dis[u + 1] > dis[u] + a[u]) {dis[u + 1] = dis[u] + a[u];q.push(make_pair(-dis[u + 1], u + 1));}if (dis[x[u]] > dis[u] + b[u]) {dis[x[u]] = dis[u] + b[u];q.push(make_pair(-dis[x[u]], x[u]));}}}
}int main() {cin >> n;for (int i = 1; i < n; i++)cin >> a[i] >> b[i] >> x[i], dis[i] = INF;dijkstra();cout << dis[n] << endl;return 0;
}

E Mancala 2(树状数组)

题意:

给出 n n n个盒子,每个盒子里有 a i a_i ai个球,盒子编号从 0 − n − 1 0-n-1 0n1。接着对 i = 1 , 2 , 3... m i=1,2,3...m i=1,2,3...m进行如下操作:

  • 变量 c = 0 c=0 c=0
  • 从编号为 b i b_i bi的盒子中拿出所有的球
  • 在至少有一个球的时候执行如下操作:

    1. c + = 1 1.c+=1 1.c+=1
    2. 2. 2.将一个球放入 ( b i + c ) % n (b_i+c)\%n (bi+c)%n的盒子里。

询问所有操作结束后,每个盒子里球的个数。

分析:

第三个操作类似区间加法,使用树状数组进行简单的区间加法即可。查询每个球的数量就是树状数组的区间查询。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int MAXN = 2e5 + 5;
#define lowbit(x) (x & (-x))
LL tr[MAXN], n, m;
LL a[MAXN], b[MAXN];LL query(LL x) {LL ans = 0;while (x > 0)ans += tr[x], x -= lowbit(x);return ans;
}void add(LL l, LL r, LL v) {while (l <= n)tr[l] += v, l += lowbit(l);r++;while (r <= n)tr[r] -= v, r += lowbit(r);
}int main() {cin >> n >> m;for (int i = 1; i <= n; i++)cin >> a[i], add(i, i, a[i]);for (int i = 1; i <= m; i++)cin >> b[i], b[i]++;for (int i = 1; i <= m; i++) {LL x = b[i];LL sum = query(x);add(x, x, -sum);LL p = sum / n;add(1, n, p);sum %= n;if (sum + x <= n)add(x + 1, x + sum, 1);elseadd(x + 1, n, 1), add(1, sum + x - n, 1);}for (int i = 1; i <= n; i++)cout << query(i) << " ";return 0;
}

F S = 1(数学)

题意:

给出整数 x , y x,y x,y,至少满足 x , y x,y x,y中的其中一个不等于 0 0 0。请找出满足以下条件的一对整数 a , b a,b a,b

  • − 1 0 18 ≤ a , b ≤ 1 0 18 -10^{18} \le a,b \le 10^{18} 1018a,b1018
  • ( 0 , 0 ) , ( x , y ) , ( a , b ) (0,0),(x,y),(a,b) (0,0),(x,y),(a,b)三点构成的三角形面积为 1 1 1

分析:

利用叉积进行分析,将题目转化成 x × b − y × a = ∣ 2 ∣ x \times b - y \times a= \vert 2 \vert x×by×a=∣2∣,使用扩展欧几里得求得一组可行解即可。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
LL n, m;LL exgcd(LL a, LL b, LL &x, LL &y) {if (b == 0LL) {x = 1LL;y = 0LL;return a;}LL x1, y1, gcd;gcd = exgcd(b, a % b, x1, y1);x = y1, y = x1 - a / b * y1;return gcd;
}int main() {cin >> n >> m;LL x, y;LL tmp = exgcd(m, -n, x, y);tmp = abs(tmp);if (2 % tmp != 0)cout << "-1" << endl;else if (tmp) {if (x == 0 and n == 0)swap(x, y);if (y == 0 and m == 0)swap(x, y);cout << 2LL / tmp * x << " " << 2LL / tmp * y << endl;}return 0;
}

G Leaf Color(树上启发式合并)

题意:

给一棵 n n n个点无根树,每个点的颜色为 a i a_i ai。询问这棵树有多少个子图 T T T,满足 T T T是一棵树,且 T T T每个叶节点的颜色都相同。

分析:

d p [ u ] [ i ] dp[u][i] dp[u][i]表示以 u u u为根,且叶子节点颜色为 i i i的子树数量,当 c o l u = i col_u=i colu=i时需要加上根的度数为 1 1 1的情况。当新加入一个儿子时, d p [ u ] [ i ] = ( ( d p [ u ] [ i ] × d p [ v ] [ i ] ) % m o d + d p [ u ] [ i ] + d p [ v ] [ i ] ) % m o d ; dp[u][i] = ((dp[u][i] \times dp[v][i]) \% mod + dp[u][i] + dp[v][i]) \% mod; dp[u][i]=((dp[u][i]×dp[v][i])%mod+dp[u][i]+dp[v][i])%mod;。同时此时的贡献一定是根的度数大于等于 2 2 2的子树贡献,所以贡献需要继续增加 d p [ u ] [ i ] × d p [ v ] [ i ] dp[u][i] \times dp[v][i] dp[u][i]×dp[v][i]。利用启发式合并降低复杂度完成转移。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
const int mod = 998244353;
const int MAXN = 2e5 + 5;
map<LL, LL> dp[MAXN];
set<int> col[MAXN];
int son[MAXN], size1[MAXN];
vector<int> edge[MAXN];
int a[MAXN];
int n, ans;void dfs1(int u, int fa) {size1[u] = 1;for (int v: edge[u]) {if (v == fa)continue;dfs1(v, u);if (size1[v] > size1[son[u]])son[u] = v;size1[u] += size1[v];}
}void dfs2(int u, int fa) {for (auto v: edge[u]) {if (v != fa)dfs2(v, u), ans += dp[v][a[u]], ans %= mod;}if (son[u] != 0)swap(dp[u], dp[son[u]]), swap(col[u], col[son[u]]);for (auto v: edge[u]) {if (v != fa && v != son[u]) {for (int x: col[v]) {ans += (dp[u][x] * dp[v][x] % mod);ans %= mod;dp[u][x] = ((dp[u][x] * dp[v][x]) % mod + dp[u][x] + dp[v][x]) % mod;col[u].insert(x);}}}dp[u][a[u]] = (dp[u][a[u]] + 1) % mod;ans++;ans %= mod;col[u].insert(a[u]);return;
}int main() {cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 2; i <= n; i++) {int u, v;cin >> u >> v;edge[u].push_back(v);edge[v].push_back(u);}dfs1(1, 0);dfs2(1, 0);cout << ans << endl;return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

书城项目历程记录2|最后阶段记录

2024年1月31日 p270-276 1.免用户名登录和注销&#xff08;知识点cookie和session&#xff09; 在学习了cookie和session之后&#xff0c;实现了免用户名登录和注销操作。 免用户名就是在本次session登录成功之后&#xff0c;对session进行setAttribute操作&#xff0c;jsp文…

【C++】模板(超详细!!!!!!)

文章目录 前言1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则2.6 声明和定义分离 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 模板分离编译4.1 什么是分离编译4.2 模板的分离编译 总结 前言 …

记录一下最近遇到的几个二叉树的题型(附好用的遍历模板)

107. 二叉树的层序遍历 II 102. 二叉树的层序遍历 987. 二叉树的垂序遍历 以上三题可共用一个模板&#xff08;dfs记录数的col和row)&#xff0c;不同之处就是使用哈希表的时候调整一下key和value&#xff1a; # Definition for a binary tree node. # class TreeNode: # …

【Linux笔记】进程间通信之管道

一、匿名管道 我们在之前学习进程的时候就知道了一个概念&#xff0c;就是进程间是互相独立的&#xff0c;所以就算是两个进程是父子关系&#xff0c;其中一个进程退出了也不会影响另一个进程。 也因为进程间是互相独立的&#xff0c;所以两个进程间就不能直接的传递信息或者…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

【doghead】VS2022 win11 安装配置WSL2 以编译linux端的cmake项目并运行1

Visual Studio 2022 在Windows上编译调试WSL2 CMake Linux工程 好像是我自己的vs2022的一个插件支持rust https://github.com/kitamstudios/rust-analyzer.vs/blob/master/PREREQUISITES.md Latest rustup (Rust Toolchain Installer). Install from here. Welcome to Rust!Th…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

『 C++ - STL 』位图(BitMap)与布隆过滤器(Bloom Filter)

文章目录 &#x1f9f8; 位图(BitMap)概念&#x1f9f8; 位图的实现&#x1fa85; 总体框架&#x1fa85; 位图的数据插入&#x1f9e9; 左移操作与右移操作的区别 &#x1fa85; 位图的数据删除&#x1fa85; 位图的数据查找&#x1fa85; 位图整体代码(供参考) &#x1f9f8;…

(06)Hive——正则表达式

Hive版本&#xff1a;hive-3.1.2 一、Hive的正则表达式概述 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本模式。 Hive的正则表达式灵活使用解决HQL开发过程中的很多问题&#xff0c;本篇文…

代码随想录算法训练营第32天| 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 完成 思路&#xff1a; 把每天的利润最大化&#xff0c;即可达到总利润的最大化。 把利润拆分到每一天&#xff0c;能获利就买。 代码 class Solution {public int maxProfit(int[] prices) {int res 0;for (int i 0; i < prices.length-1; i…

Activation of network connection failed(ubuntu连不上网)

ubuntu连不上网&#xff0c;看了好几个方法找到个有用的记录一下 1. 还原默认设置 2. 更改适配器&#xff1a;加上vmware bridge protocol

使用Vue.js输出一个hello world

导入vue.js <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 创建一个标签 <div id"app">{{message}}</div> 接管标签内容&#xff0c;创建vue实例 <script type"text/javascript">va…

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件&#xff1f;3. 具体使用中间件3.1 中间件所在的位置&#xff1a;在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释&#xff1a;在浏览器在请求服务器的时候&#xff0c;首先要…

【无标题】JAVA学习-集合.编写equals和hashCode

编写equals()和hashCode()方法需要遵循以下原则&#xff1a; 1. equals()方法&#xff1a; - 使用instanceof关键字检查传入的对象是否为当前类的实例。 - 检查传入的对象是否为null。 - 检查传入的对象的类型是否与当前对象的类型相同。 - 比较对象的属性是否相等&#x…

如何在 Ubuntu VPS 上使用 Celery 与 RabbitMQ 来做队列

简介 异步或非阻塞处理是一种将某些任务的执行与程序的主要流程分离的方法。这为您提供了几个优势&#xff0c;包括允许用户界面代码在没有中断的情况下运行。 消息传递是程序组件用来通信和交换信息的一种方法。它可以同步或异步实现&#xff0c;并且可以允许离散进程进行无问…

2月14日作业

1、安装tftp服务器和nfs服务器&#xff0c;准备需要下载到开发板文件&#xff0c;存放在指定下载文件夹下&#xff0c;准备需要挂载到开发板文件夹&#xff0c;存放在指定挂载文件夹中。 2、ubuntu和开发板组网&#xff0c;关闭防火墙&#xff0c;关闭杀毒软件&#xff0c;配置…

探索XGBoost:自动化机器学习(AutoML)

探索XGBoost&#xff1a;自动化机器学习&#xff08;AutoML&#xff09; 导言 自动化机器学习&#xff08;AutoML&#xff09;是一种通过自动化流程来构建、训练和部署机器学习模型的方法。XGBoost作为一种强大的机器学习算法&#xff0c;也可以用于AutoML。本教程将介绍如何…

NLP快速入门

NLP入门 课程链接&#xff1a;https://www.bilibili.com/video/BV17K4y1W7yb/?p1&vd_source3f265bbf5a1f54aab2155d9cc1250219 参考文档链接1&#xff1a;NLP知识点&#xff1a;Tokenizer分词器 - 掘金 (juejin.cn) 一、分词 分词是什么&#xff1f; 每个字母都有对应…

【Web】从零开始的js逆向学习笔记(上)

目录 一、逆向基础 1.1 语法基础 1.2 作用域 1.3 窗口对象属性 1.4 事件 二、浏览器控制台 2.1 Network Network-Headers Network-Header-General Network-Header-Response Headers Network-Header-Request Headers 2.2 Sources 2.3 Application 2.4 Console 三、…

车载诊断协议DoIP系列 —— DoIP会话模式(安全与非安全)

车载诊断协议DoIP系列 —— DoIP会话模式(安全与非安全) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖…