ATCoder Beginner Contest 340 A~G

news2024/11/25 5:00:11

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);
        else
            add(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.coloradmin.cn/o/1449545.html

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

相关文章

CTF-web 之 burp suite 使用

burp suite 使用 一般其是作为一个辅助工具&#xff0c;直接使用来解题的部分是少数&#xff0c;我们可以使用它来观察请 求和响应&#xff0c;并且可以反复的提交&#xff0c;关键的是他还带有很多其他的功能&#xff0c;在我们做题的过程中&#xff0c; 使用的关键点包括&…

算法沉淀——栈(leetcode真题剖析)

算法沉淀——栈 01.删除字符串中的所有相邻重复项02.比较含退格的字符串03.基本计算器 II04.字符串解码05.验证栈序列 栈&#xff08;Stack&#xff09;是一种基于先进后出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则的数据结构。栈具有两个主要的操作&am…

统一数据返回格式 及 可能遇到的问题;统一异常处理

统一数据返回格式 统一数据返回格式就像我们寄快递一样&#xff0c;不管你需要寄的东西具体是什么都需要将它打包到统一的快递箱中。 此时我们需要一个“快递箱”用来将返回的数据“装”在里面。这个类是根据业务情况来自行定义的。 Data public class Resp<T> {//200…

【算法随想录03】相交链表

题目&#xff1a;160. 相交链表 难度&#xff1a;EASY 思路 主要难点在于如何进行节点之间的对应。两条链表长度不定长&#xff0c;如何找到需要对比的节点至关重要。 我们从后往前看&#xff0c;我们需要对比的节点有什么特点。一个最大的特点就是后面的节点数相同。这就…

Python算法题集_对称二叉树

Python算法题集_对称二叉树 题101&#xff1a;对称二叉树1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代】3) 改进版二【BFS迭代deque】 4. 最优算法 本文为Python算法题集之一的代码示例 题101&#xff1a;对…

软件架构设计--操作系统

常见I/O类型:缓冲I/O和直接I/O 缓冲I/O是C语言提供的库函数 直接I/O是Linux系统API 应用程序内存:代码中用malloc/free,new/delete 等分配出来的内存 用户缓冲区:C语言的FILE结构体里面的bufer. 内核缓冲区:Linux操作系统的Page Cache. 1Page 一般为4K 缓冲I/O的读操作有3次数…

JVM(4)原理篇

1 栈上的数据存储 在Java中有8大基本数据类型&#xff1a; 这里的内存占用&#xff0c;指的是堆上或者数组中内存分配的空间大小&#xff0c;栈上的实现更加复杂。 以基础篇的这段代码为例&#xff1a; Java中的8大数据类型在虚拟机中的实现&#xff1a; boolean、byte、char…

【贪心算法】代码随想录算法训练营第三十二天 |122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II(待补充)

122.买卖股票的最佳时机II&#xff08;未观看&#xff0c;动态待补充&#xff09; 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个数组&#xff0c;它的…

云备份项目:在云端保护您的数据【一、初识】

桃李不言&#xff0c;下自成蹊 文章目录 项目简介项目设计方案服务端功能划分客户端功能划分 项目环境搭建环境准备第三方库JsonCppbundle数据压缩库httplib 总结 ☘️项目源代码&#xff1a;云备份 ☘️云备份专栏&#xff1a;云备份 项目简介 云备份系统是一个自动化的备份解…

vue3 之 商城项目—结算模块

路由配置 chekout/index.vue <script setup> const checkInfo {} // 订单对象 const curAddress {} // 地址对象 </script> <template><div class"xtx-pay-checkout-page"><div class"container"><div class"w…

Linux platform tree下的单总线驱动程序设计(DHT11)

目录 概述 1 认识DHT11 1.1 DHT11特性 1.2 DHT11数据格式 1.3 DHT11与MCU通信 1.4 DHT11信号解析 1.4.1 起始信号 1.4.2 解析信号0 1.4.3 解析信号1 2 驱动开发 2.1 硬件接口 2.2 更新设备树 2.2.1 添加驱动节点 2.2.2 编译.dts 2.2.3 更新板卡中的.dtb 2.3 驱…

【开源】SpringBoot框架开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…

蓝桥杯嵌入式学习记录——按键的使用

目录 一、按键原理简介 二、cubeMX的配置 三、按键的短按代码 四、按键的长按代码 一、按键原理简介 在STM32中&#xff0c;按键连接通常使用GPIO&#xff08;通用输入/输出&#xff09;端口来实现。当按键未被按下时&#xff0c;GPIO端口处于高电平状态&#xff08;即1&am…

【Go语言】第一个Go程序

第一个 Go 程序 1 安装 Go Go语言官网&#xff1a;Download and install - The Go Programming Language&#xff0c;提供了安装包以及引导流程。 以 Windows 为例&#xff0c;进入windows安装包下载地址&#xff1a;All releases - The Go Programming Language&#xff0c…

【Midjourney】解密Midjourney付费订阅:畅享全新体验!(详细流程与各版本一览)

一、Midjourney 付费订阅流程 1、在首页点击Purchase plan 2、进入到midjourney年月选择页面 3、这里续费一个最便宜的版本 , 按年付费 8 , 按月 10 4、输入银行卡信息 , 用的WildCard虚拟信用卡 &#xff0c;打开 5、填写完银行卡信息就订阅成功 二、Midjourney 各版本介绍…

洛谷_P1923 【深基9.例4】求第 k 小的数_python写法

哪位大佬可以出一下这个的题解&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;话说蓝桥杯可以用numpy库吗&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 这道题有一个很简单的思路就是排序完成之后再访问。 but有很大的问题&…

SAP PP学习笔记- 豆知识01 - 怎么查询既存品目

SAP系统当中已经有哪些品目要怎么查询呢&#xff1f; 1&#xff0c;MM60 品目一览 这里可以输入Plant&#xff0c;然后可以查询该工厂的所有品目。 2&#xff0c;SE16 > MARA MARA 品目一般データ&#xff0c;存放的是品目基本信息。 要查询该品目属于哪个Plant&#xff…

如何在30天内使用python制作一个卡牌游戏

如何在30天内使用python制作一个卡牌游戏 第1-5天&#xff1a;规划和设计第6-10天&#xff1a;搭建游戏框架第11-20天&#xff1a;核心游戏机制开发第21-25天&#xff1a;游戏界面和用户体验第26-30天&#xff1a;测试和发布附加建议游戏类型游戏规则设计界面设计技术选型第6-…

下一代Windows系统曝光:基于GPT-4V,Agent跨应用调度,代号UFO

下一代Windows操作系统提前曝光了&#xff1f;&#xff1f; 微软首个为Windows而设的智能体&#xff08;Agent&#xff09; 亮相&#xff1a; 基于GPT-4V&#xff0c;一句话就可以在多个应用中无缝切换&#xff0c;完成复杂任务。整个过程无需人为干预&#xff0c;其执行成功…

MySQL 基础知识(四)之表操作

目录 1 约束 2 查看已有表 3 创建表 4 查看表结构 5 修改表 6 删除表 1 约束 主键约束 primary key&#xff1a;唯一&#xff0c;标识表中的一行数据&#xff0c;此列的值不可重复&#xff0c;且不能为 NULL&#xff0c;此外&#xff0c;可以多个列组成主键唯一约束 uniq…