暑期训练8

E. G-C-D, Unlucky!

题目要求

判断是否存在一个长度为 n 的数组 a,使得

  • p[i]a[0..i] 的前缀 GCD

  • s[i]a[i..n-1] 的后缀 GCD

思路

前缀 GCD 非递增

后缀 GCD 非递减

首尾 GCD 一致

桥梁条件成立

  • 对于每个位置 igcd(p[i], s[i+1]) 必须等于整个数组的 GCD(即 s[0])。

  • 这一步是构造合法中间元素 a[i] 的必要条件

全部满足 → 输出 YES,否则 NO

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){long long n;cin>>n;vector<long long>p(n);vector<long long>s(n);for(int i=0;i<n;i++)cin>>p[i];for(int i=0;i<n;i++)cin>>s[i];if(p[n-1]!=s[0]){  //if(p.back()!=s[0])cout<<"NO"<<endl;return;}for(int i=1;i<n;i++){if(p[i-1]%p[i]&&i-1>=0){cout<<"NO"<<endl;return;}}for(int i=n-2;i>=0;i--){if(s[i+1]%s[i]&&i+1<n){cout<<"NO"<<endl;return;}}for(int i=0;i<n-1;i++){if(__gcd(p[i],s[i+1])!=s[0]){cout<<"NO"<<endl;return;}}cout<<"YES"<<endl;
}
int main(){long long t;cin>>t;while(t--){solve();}return 0;
}

C. I Will Definitely Make It

本题要求

判断能否在水位不断上涨的情况下,从初始塔出发,通过多次传送最终到达最高的塔

思路

  1. 排序塔高度
    将所有塔按高度升序排序,方便后续贪心处理。

  2. 找到初始塔位置
    在排序后的数组中找到初始塔的高度 x 所在的位置 m

  3. 快速判断边界情况

    • 如果最高塔与初始塔的高度差 ≤ 初始塔高度(h[n] - x ≤ x),可以直接传送到最高塔,输出 YES

    • 如果初始塔的下一个塔就比初始塔高太多(h[m+1] - x > x),第一步就无法传送,直接输出 NO

  4. 贪心验证后续跳跃

    • 从初始塔 x 开始,依次向后检查是否能“逐级跳跃”到最高塔。

    • 每次跳跃的代价是 h[i] - x,累计代价不能超过当前塔高度 x

    • 每次跳跃后,更新基准高度 x = h[i](重置起点),继续向后验证。

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){long long n,k;cin>>n>>k;long long h[n+1];for(int i=1;i<=n;i++)cin>>h[i];int x=h[k];sort(h+1,h+n+1);int m;for(int i=1;i<=n;i++){if(h[i]==x)m=i;}if(h[n]-x<=x){cout<<"YES"<<endl;return;}else if(h[m+1]-x>x){cout<<"NO"<<endl;return;}else{bool flag=1;int c=0;for(int i=m+1;i<=n;i++){c+=h[i]-x;   //易错点,这里是比较时间,一定是累计时间总和,千万不要直接if(c<=x)x=h[i];   //用h[i]-x<=x来判断,虽然样例过了,但实际上逻辑一点不对else{cout<<"NO"<<endl;flag=0;break;}}if(flag)cout<<"YES"<<endl;}
}
int main(){long long t;cin>>t;while(t--)solve();return 0;
}

D. This Is the Last Time

题目要求

n 家赌场,第 i 家给出 (l_i, r_i, real_i),当前硬币数 k 必须满足 l_i ≤ k ≤ r_i 才能进入第 i 家赌场,进入后硬币数立即变成 real_i每家赌场只能去一次,顺序可以任意,最多 能带走的硬币数。

思路

先把所有赌场按“门槛”从小到大排好,然后从左到右扫一遍:只要当前手里的钱 k 够得着某家赌场,并且进去后钱会更多,就立刻进去把钱换成更大的 real_i;扫完一遍后手里的钱就是最大可能值。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct node{long long l,r,re;
}p[N];
bool cmp(node x,node y){if(x.l==y.l)return x.r<y.r;return x.l<y.l;
}
void solve(){long long n,k;cin>>n>>k;for(int i=0;i<n;i++){cin>>p[i].l>>p[i].r>>p[i].re;}sort(p,p+n,cmp);for(int i=0;i<n;i++){if(k>=p[i].l&&k<=p[i].r&&k<p[i].re){k=p[i].re;}}cout<<k<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

F. 1-1-1, Free Tree!

题目要求

给定一棵 n 个点的无根树,每条边连接 (u,v) 并有一个权值 c,每个顶点有一个颜色 a[i]。
边权规则:

  • 如果两端颜色相同,这条边对总代价贡献 0;

  • 不同则贡献 c。

接下来有 q 次查询:
每次给出 (u, x) —— 把顶点 u 的颜色改成 x,每次改色后,输出整棵树当前的总代价,颜色变化会累计,查询之间互相关联。

思路

  1. 建立树结构
    用邻接表存无向边。

  2. 预处理:DFS 把无向树变成“以 1 为根的有根树”
    • 记录每个节点 u 的父节点 fa[u] 以及到父节点的边权 c[u]。
    • 同时计算初始总代价 ans:对于每条树边 (u,fa[u]),若 a[u] ≠ a[fa[u]],就把 c[u] 累进 ans。
    • 用 map<int,int> mp[u] 记录“u 的所有子节点中颜色为 col 的边权和”,方便后面 O(log deg(u)) 批量更新。

  3. 处理查询
    对于每次 (u, x):
    • 若 x == a[u],颜色无变化,直接输出当前 ans。
    • 否则:

    1. 处理父边:
      – 若 u 不是根,判断原来 u 与父节点颜色是否相同。
      – 同色→不同色:ans += c[u](原来贡献 0,现在贡献 c[u])。
      – 不同色→同色:ans -= c[u](原来贡献 c[u],现在贡献 0)。
      – 在父节点的 mp 表中把旧颜色减、新颜色加。

    2. 处理子边:
      – 原来与 u 同色→不同色:把 mp[u][old] 全部加回 ans。
      – 原来与 u 不同色→同色:把 mp[u][new] 全部减掉。

    3. 真正更新 a[u] = x,并输出 ans。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;typedef pair<int,int> PII;
const int N=2e5+10;/* ---------- 全局变量 ---------- */
int n,q,a[N];                   // a[i]: 节点 i 的当前颜色
map<int,int> mp[N];             // mp[u][col]: 节点 u 的所有子节点中颜色为 col 的边权和
vector<PII> g[N];               // 邻接表: g[u] = {v,w}
int ans;                        // 整棵树当前总边权和
int fa[N],c[N];                 // fa[i]: i 的父节点  c[i]: i 到父节点的边权/* ------------------------------------------------------------------*  dfs(u): 以 u 为根向下遍历*  1. 建立父子关系*  2. 计算初始 ans*  3. 填充 mp[u][col] 方便后续查询* ------------------------------------------------------------------ */
void dfs(int u) {for (size_t i = 0; i < g[u].size(); ++i) {int v = g[u][i].first;int w = g[u][i].second;if (v == fa[u]) continue;   // 不往回走fa[v] = u;                  // 记录父节点c[v]  = w;                  // 记录到父节点的边权if (a[v] != a[u]) ans += w; // 两端颜色不同 → 产生代价mp[u][a[v]] += w;           // 把这条边挂到父节点的“子边表”dfs(v);                     // 继续向下}
}/* ------------------------------------------------------------------*  主逻辑:读入 → 建树 → 预处理 → 处理每个查询* ------------------------------------------------------------------ */
void solve() {cin >> n >> q;ans = 0;/* ---------- 清空上一组数据 ---------- */for (int i = 1; i <= n; ++i) {fa[i] = -1;g[i].clear();mp[i].clear();c[i] = 0;}/* ---------- 读入颜色 ---------- */for (int i = 1; i <= n; ++i) cin >> a[i];/* ---------- 读入 n-1 条无向边 ---------- */for (int i = 1; i < n; ++i) {int u, v, w;cin >> u >> v >> w;g[u].push_back(make_pair(v, w));g[v].push_back(make_pair(u, w));}/* ---------- 以 1 为根做 DFS,建立父子关系并算初始答案 ---------- */dfs(1);/* ---------- 处理每个查询 ---------- */while (q--) {int u, x;               // 把顶点 u 的颜色改成 xcin >> u >> x;if (a[u] == x) {        // 颜色没变?直接输出cout << ans << '\n';continue;}/* 1. 先处理 u 与父节点之间的边 */if (fa[u] != -1) {int w = c[u];       // u 到父节点的边权// 原来同色 → 现在不同色:要加 wif (a[u] == a[fa[u]]) ans += w;// 原来不同色 → 现在同色:要减 wif (x == a[fa[u]]) ans -= w;/* 更新父节点的 mp 表:旧颜色减,新颜色加 */mp[fa[u]][a[u]] -= w;mp[fa[u]][x]    += w;}/* 2. 再处理 u 与其所有子节点之间的边 */// 原来同色 → 现在不同色:把子边全加回来if (mp[u].count(a[u])) ans += mp[u][a[u]];// 原来不同色 → 现在同色:把子边全减掉if (mp[u].count(x))    ans -= mp[u][x];/* 3. 真正修改颜色 */a[u] = x;/* 4. 输出更新后的总边权和 */cout << ans << '\n';}
}/* ---------- 主函数:多组数据 ---------- */
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while (T--) solve();return 0;
}

A Only One Digit

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){int x;cin>>x;int mn=10;while(x){mn=min(mn,x%10);x/=10;}cout<<mn<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

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

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

相关文章

深入解析Hadoop HDFS高可用性:原理、故障切换与元数据同步

Hadoop HDFS高可用性(HA)概述在分布式存储领域&#xff0c;Hadoop分布式文件系统(HDFS)作为Hadoop生态系统的核心存储组件&#xff0c;其高可用性(HA)设计一直是架构师们关注的焦点。传统HDFS架构中&#xff0c;NameNode作为单一主节点管理整个文件系统的元数据&#xff0c;这种…

Freertos源码分析:任务创建/删除

任务创建/删除流程1.简介FreeRTOS 中任务创建通过 xTaskCreate() 或 xTaskCreateStatic() 实现。动态创建&#xff08;xTaskCreate&#xff09;会自动分配任务栈和TCB&#xff08;任务控制块&#xff09;&#xff0c;静态创建&#xff08;xTaskCreateStatic&#xff09;需用户预…

warning: _close is not implemented and will always fail

相关问题&#xff1a; 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、环境&#xff1a; ubuntu24.04实体机、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

MyBatis之缓存机制详解

MyBatis之缓存机制详解一、MyBatis缓存的基本概念1.1 缓存的核心价值1.2 MyBatis的两级缓存体系二、一级缓存&#xff08;SqlSession级别缓存&#xff09;2.1 工作原理2.2 实战案例&#xff1a;一级缓存演示2.2.1 基础用法&#xff08;默认开启&#xff09;2.2.2 一级缓存失效场…

云服务器搭建自己的FRP服务。为什么客户端的项目需要用Docker启动,服务端才能够访问到?

简单回答&#xff1a;在云服务器搭建FRP服务时&#xff0c;客户端项目用Docker启动并非必需&#xff0c;而是因为Docker的特性简化了配置&#xff1a; Docker通过端口映射&#xff08;如-p 本地端口:容器端口&#xff09;能固定项目对外暴露的端口&#xff0c;减少本地端口冲突…

6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4 DHT11温湿度传感器3.5 烟雾/燃气传感器模块&#xff1a;MQ-23.6 火焰传感器3.7 门磁模块MC-38 4 设计PCB4.1 安装下…

DevOps落地的终极实践:8大关键路径揭秘!

本文来自腾讯蓝鲸智云社区用户: CanWay当前&#xff0c;DevOps因其能够降低IT运营成本、提高软件质量并加快上市时间的能力而在全球范围内引起广泛关注。它打破了传统软件开发与运营的界限&#xff0c;消除了新功能发布延迟和软件质量下降的障碍。DevOps通过实施持续集成、持续…

react - 根据路由生成菜单

后端返回菜单的格式menuList:[{index: true,name: "",component: "../views/Home",meta: { title: "首页", requiresAuth: true,roles:[user]},},{path: "/admin",name: "admin",meta: { title: "管理页", roles:…

Window延迟更新10000天配置方案

1.点击"开始"菜单&#xff0c;搜索"注册表编辑器"&#xff0c;点击"打开"。2.找到"\HKEY LOCAL MACHINE\SOFTWARE\Microsoft\WindowsUpdate\Ux\Settings"路径。3.右面空白处右键新建一个32位值&#xff0c;命名为FlightSettingsMaxPau…

【OD机试】人民币转换

题目描述 将阿拉伯数字金额转换为中文大写金额格式,需遵循以下规则: 1、 前缀要求:中文大写金额前必须标明“人民币”字样。 2、 用字规范:使用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样。 3、 “整”字规则: 金额到“元”为止…

在ajax中什么时候需要将返回值类型做转换

$.ajax({url: TMSPROC0050/deleteData?accidentIds accidentIds.join(,),type: DELETE,dataType: json,success: function(result) {$(#accidentGrid).datagrid(reload);$.messager.show({title: 成功,msg: result.message})},error: function(result) {$.messager.alert({ti…

Helm常用命令大全(2025最新版)

文章目录Helm常用命令大全&#xff08;2025最新版&#xff09;一、基础命令与环境配置版本与帮助信息安装与升级HelmLinux系统安装版本升级注意事项二、仓库管理命令仓库基础操作OCI仓库支持&#xff08;v3.8新特性&#xff09;三、Chart操作命令Chart创建与打包Chart搜索与下载…

gitlab+jenkins

文章目录架构gitlab和jenkins安装jenkins配置gitlab配置jenkins与gitlab联动参考架构 gitlab和jenkins安装 部署docker 部署jenkins 启动jenkins 用户&#xff1a;admin&#xff0c;对应的密码如下 点击安装自定义推荐的插件 安装gitlab插件 jenkins配置 配置pipline…

Redis字符串操作指南:从入门到实战应用

Redis作为一款高性能的键值存储数据库&#xff0c;其字符串&#xff08;String&#xff09;类型是最基础也最常用的数据类型。它不仅能存储简单的文本信息&#xff0c;还能应对数字计算、二进制数据等多种场景&#xff0c;灵活且高效。接下来&#xff0c;我们就全方位剖析Redis…

SQLite 数据库字段类型-详细说明,数据类型详细说明。

SQLite 数据类型 SQLite字段类型详细说明&#xff0c;包含存储类、亲和类型、布尔类型、日期时间类型的存储方式、取值范围及核心特性。 创建 SQLite3 表时可使用的各种数据类型名称&#xff0c;同时也介绍了相应的亲和类型。 一、核心存储类&#xff08;Storage Classes&am…

Node.js特训专栏-实战进阶:17.会话管理与安全存储

🔥 欢迎来到 Node.js 实战专栏!在这里,每一行代码都是解锁高性能应用的钥匙,让我们一起开启 Node.js 的奇妙开发之旅! Node.js 特训专栏主页 专栏内容规划详情 会话管理与安全存储:从原理到实战的Web安全实践 在Web应用中,会话(Session)是维持用户状态的核心机制—…

【橘子分布式】gRPC(编程篇-中)

一、简介 我们之前已经完成了对于api模块的开发&#xff0c;也就是已经生成了基础的类和对应的接口&#xff0c;现在我们需要完成的是client和server端的开发。其实如同thrift一样&#xff0c;现在要做的就是实现我们之前定义的service里面的hello方法&#xff0c;里面写我们的…

Spring Boot 项目中数据同步之binlog和MQ

在 Spring Boot 项目中&#xff0c;“监听 binlog” 和 “业务代码中集成 MQ” 是实现数据同步、事件驱动的两种主流方法。 简单来说&#xff0c;这个选择可以概括为&#xff1a; 监听 Binlog (如使用 Canal)&#xff1a;像一个数据库的贴身秘书&#xff0c;它忠实地记录数据库…

MySQL 写入性能优化全攻略(附 GitHub 面试题项目链接)

面试中你可能会遇到这样的问题&#xff1a; &#x1f4ac; “假设你的接口一天收到百万级请求&#xff0c;MySQL 撑得住吗&#xff1f;你会怎么优化写入性能&#xff1f;” 刚开始我也懵过&#xff0c;后来不断复盘与总结&#xff0c;现在我可以用结构化方式给出一个相对完整的…

用Dynamic chunk去干掉tokenizer?

一般你们下AR模型的时候&#xff0c;都有这个&#xff0c;也就是tokenzier&#xff0c;tokenizer是干啥的&#xff0c;其实就是你的分词字典不光有specal的token对应的还有实际的对应的分词对应的代码&#xff0c;比如&#xff1a;也有tokenzier没显示的&#xff0c;比如&#…