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 模板的分离编译 总结 前言 …

【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;本篇文…

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;首先要…

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)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖…

【STM32 CubeMX】学STM必会的数据结构——环形缓冲区

文章目录 前言一、环形缓冲区是什么二、实现环形缓冲区实现分析2.1 环形缓冲区初始化2.2 写buf2.3 读buf2.4 测试 三、代码总况总结 前言 在嵌入式系统开发中&#xff0c;经常需要处理数据的缓存和传输&#xff0c;而环形缓冲区是一种常见且有效的数据结构&#xff0c;特别适用…

幻兽帕鲁官方更新了,服务器端怎么更新?

幻兽帕鲁官方客户端更新了&#xff0c;那么它的服务器端版本也是需要更新的&#xff0c;不然版本不一致的话&#xff0c;就不能进入游戏了。 具体的更新方法有两种&#xff0c;一是手动输入命令进行更新。第二种是在面板一键更新。 无论你是在阿里云或者腾讯云购买的一键部署…

Pycharm里如何设置多Python文件并行运行

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 夕阳何事近黄昏&#xff0c;不道人间犹有未招魂。 大家好&#xff0c;我是皮皮。 一、前言 相信使用Pycharm的粉丝们肯定有和我一样的想法&#xff0c;…

算法学习——LeetCode力扣贪心篇1

算法学习——LeetCode力扣贪心篇1 455. 分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[…

Vulnhub靶机:DC3

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;DC3&#xff08;10.0.2.56&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/dc-32,312…

嵌入式系统的基础知识:了解嵌入式系统的构成和工作原理

&#xff08;本文为简单介绍&#xff0c;个人观点仅供参考&#xff09; 嵌入式系统是建立在微处理器基础上的计算机系统,用于对专门的功能进行控制、运算和接口。它结合了硬件和软件,可以提供实时的响应,广泛应用于工业控制、通信、医疗、交通等领域。 嵌入式系统的核心是微处理…