ICPC 2024 杭州站

news/2025/1/27 7:02:57/文章来源:https://www.cnblogs.com/udiandianis/p/18691418

A. AUS

题目大意

给你三个字符串S1、S2、S3,问是否存在一种字母映射方式使得F(S1)等于F(S2)但是不等于F(S3)

解题思路

想要让S1、S2相等首先显然要满足长度相等,因此可以先把长度不相等的时候的存在关系判断出来,对于三个字符串都相等的情况,可以通过遍历修改字符串让S1变成S2,或者S2变成S1,逐字符比较不相等修改即可,这样的修改Python有一个内置函数replace(C++的只替换指定位置)可以直接替换完成映射,最后只需要查看是不是满足题目要求即可

代码实现

for _ in range(int(input())):s1 = input()s2 = input()s3 = input()if len(s1) != len(s2):print("NO")elif len(s1) != len(s3):print("YES")else:S1 = [s1, s1]S2 = [s2, s2]S3 = [s3, s3]for i in range(len(s1)):A, B = S1[0][i], S2[0][i]if A != B:S1[0] = S1[0].replace(B, A)S2[0] = S2[0].replace(B, A)S3[0] = S3[0].replace(B, A)A, B = S1[1][i],  S2[1][i]if A != B:S1[1] = S1[1].replace(A, B)S2[1] = S2[1].replace(A, B)S3[1] = S3[1].replace(A, B)if S1[0] == S2[0] and S1[0] != S3[0] or S1[1] == S2[1] and S1[1] != S3[1]:print("YES")else:print("NO")

K. Kind of Bingo

题目大意

给你一个n*m的网格,再给你一个排列表示标记的顺序,问修改操作顺序后让一行网格被标记最少要操作多少次

解题思路

根据给出的这个数值大小即可得知当前正在标记哪一行, 允许修改k次则保证至少能把k个靠后的操作放到前面来,因此我们只需要找到第一个满足m-k(至少得是0)的行是哪一行,再对这一行改变操作即可,注意最后的答案要和m取max——至少操作m次才能填充m个

代码实现

#include <bits/stdc++.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;std::cin >> t;while (t--) {int n, m, k, ok = -1;std::cin >> n >> m >> k;std::vector<int> p(n * m), f(n);for (int i = 0; i < n * m; i++) {std::cin >> p[i];int x = (p[i] - 1) / m;f[x]++;if (ok == -1 && f[x] >= std::max(0, m - k)) {ok = x;}}std::vector<int> ans;for (int i = 0; i < n * m; i++) {int x = (p[i] - 1) / m;if (x == ok) {ans.push_back(i + 1);}}std::cout << std::max(m, ans[std::max(0, m - k - 1)]) << "\n";}
}

E. Elevator II

题目大意

有一部电梯每次只能乘坐1人,上升消耗r-l,下降无消耗,问把所有人送到目的地的最小消耗之和并给出安排方案

解题思路

先让电梯升到最高处,上升过程中的人能送就送(他们都是去往最高处途中顺手的事),然后按照r降序送,这样保证了最高不会再来,不会有浪费,途中记录一下乘客在原序列的中的位置最后输出即可

代码实现

#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;std::cin >> t;while (t--) {int n, f;std::cin >> n >> f;std::vector<std::array<int, 3>> lr(n);for (int i = 0; i < n; i++) {std::cin >> lr[i][0] >> lr[i][1];lr[i][2] = i + 1;}std::sort(lr.begin(), lr.end());i64 ans = 0;std::vector<int> ord, F(n);for (int i = 0; i < n; i++) {auto [l, r, idx] = lr[i];if (l < f) {if (r > f) {f = r;ans += r - l;ord.push_back(idx);F[idx - 1] = 1;}continue;}if (l > f) {ans += l - f;}f = r;ans += r - l;ord.push_back(idx);F[idx - 1] = 1;}std::sort(lr.begin(), lr.end(), [&](std::array<int, 3> a, std::array<int, 3> b) { return a[0] > b[0]; });for (int i = 0; i < n; i++) {auto [l, r, idx] = lr[i];if (F[idx - 1]) {continue;}f = r;ans += r - l;ord.push_back(idx);F[idx - 1] = 1;}std::cout << ans << "\n";for (int i = 0; i < n; i++) {std::cout << ord[i] << " \n"[i == n - 1];}}
}

H. Heavy-light Decomposition

题目大意

给你几条链,问能否构造出一棵树,让它HLD的结果是这几条链

解题思路

乱搞一下发现不可能的情况有两种,链的长度全相等或者至少有两条最长链,链的长度极差是1(证明)。
剩下的情况里,如果只有一条链直接输出即可;如果最长链只有一条,其他链挂最长链第一个节点即可;如果有多条最长链,最短链挂最长链第二个节点,其余链挂最长链第一个节点即可

代码实现

#include <bits/stdc++.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;std::cin >> t;while (t--) {int n, k, maxn = 0, minn = 1e9, cnt = 0, idx = -1;std::cin >> n >> k;std::vector<int> len(k);std::vector<std::array<int, 2>> lr(k);for (int i = 0; i < k; i++) {std::cin >> lr[i][0] >> lr[i][1];len[i] = lr[i][1] - lr[i][0] + 1;if (len[i] > maxn) {idx = i;}if (maxn == len[i]) {cnt++;} else if (maxn < len[i]) {maxn = len[i];cnt = 1;}minn = std::min(minn, len[i]);}if (maxn == minn && k >= 2 || maxn - minn == 1 && cnt >= 2) {std::cout << "IMPOSSIBLE\n";} else {std::vector<int> ans(n + 1);if (cnt == 1) {for (auto [l, r] : lr) {ans[l] = lr[idx][0];for (int i = l + 1; i <= r; i++) {ans[i] = i - 1;}}ans[lr[idx][0]] = 0;} else {ans[lr[idx][0]] = 0;for (int i = lr[idx][0] + 1; i <= lr[idx][1]; i++) {ans[i] = i - 1;}for (int i = 0; i < k; i++) {if (i != idx) {if (len[i] != minn) {ans[lr[i][0]] = lr[idx][0];for (int j = lr[i][0] + 1; j <= lr[i][1]; j++) {ans[j] = j - 1;}} else {ans[lr[i][0]] = lr[idx][0] + 1;for (int j = lr[i][0] + 1; j <= lr[i][1]; j++) {ans[j] = j - 1;}}}}}for (int i = 1; i <= n; i++) {std::cout << ans[i] << " \n"[i == n];}}}
}

M. Make It Divisible

题目大意

给你一个数组,问每个数都加上x后满足相邻数字互为倍数的x有多少个并求和

解题思路

先用单调栈找到所有bi和它两侧第一个比它大的数构成多个AB数对,接下来挑选x让所有AB数对成为倍数关系,只需要枚举任意一个数对差值的fac,找出构成所有数对都为倍数关系的fac统计即可

代码实现

#include <bits/stdc++.h>using i64 = long long;int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;std::cin >> t;while (t--) {i64 n, k;std::cin >> n >> k;std::vector<int> b(n);for (int i = 0; i < n; i++) {std::cin >> b[i];}std::stack<int> stk;std::vector<std::array<int, 2>> P;for (int i = 0; i < n; i++) {while (!stk.empty() && b[stk.top()] >= b[i]) {if (b[stk.top()] > b[i]) {P.push_back({b[i], b[stk.top()]});}stk.pop();}stk.push(i);}while (!stk.empty()) {stk.pop();};for (int i = n - 1; i >= 0; i--) {while (!stk.empty() && b[stk.top()] >= b[i]) {if (b[stk.top()] > b[i]) {P.push_back({b[i], b[stk.top()]});}stk.pop();}stk.push(i);}if (P.empty()) {std::cout << k << " " << k * (k + 1) / 2 << "\n";continue;}std::vector<int> X;int A = P[0][1] - P[0][0];for (int i = 1; i * i <= A && i <= k + P[0][0]; i++) {if (A % i == 0) {if (i > P[0][0]) {X.push_back(i - P[0][0]);}if (A / i > i && A / i <= k + P[0][0] && A / i > P[0][0]) {X.push_back(A / i - P[0][0]);}}}std::vector<int> ans;for (auto x : X) {int f = 1;for (auto [A, B] : P) {if ((B + x) % (A + x) != 0) {f = 0;break;}}if (f) {ans.push_back(x);}}std::cout << ans.size() << " " << std::accumulate(ans.begin(), ans.end(), 0ll) << "\n";}
}

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

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

相关文章

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…

玩转单例模式

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。 单例模式的好处:能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间; 能够…

佳能EOS888说明书

这回讲佳能EOS888,EOS 888/EOS 5000于1995年元月推出,原来主要是面向东南亚市场,“888”就是取“发发发”的谐音。后来受到用户喜爱,于是就以EOS 5000的型号推向国际市场。 先贴个规格参数由于某文库某丁网某人的说明书需要付费下载,并且缺39页,找了英文版的39页补全。 说…

处理nginx解析跳转的域名不是最新的ip问题

我的场景是这样的,使用了贝锐的ddns服务,但是服务器上的nginx配置的域名解析不到最新的ip地址 问题如下我的贝锐域名可以打开,但是这里显示的不是最新的ip地址 在nginx.conf配置文件中加入resolver 223.5.5.5 223.6.6.6 valid=60s; 这里表示缓存的时间是60秒

【模拟电子技术】15-Q点稳定的放大电路和基本共集放大电路

【模拟电子技术】15-Q点稳定的放大电路和基本共集放大电路增加RE抑制温漂增加RB2并使得经过它的电流很大,分压大,使得静态工作点趋于稳定但是RE电阻在交流通路中会使得放大倍数减小(即使我们分析输入电阻,得到输入电阻增加了,但是我们还是希望得到一个高放大倍数的电路)于…

【AI+零售】构建一个有智能体参与的去中心化RWA零售生态系统商业模型

# 零售行业 在零售行业中,传统中心化模式因信息不对称、效率低下和利益分配不公平等问题逐渐暴露其局限性。而随着区块链、人工智能(AI)和智能体(Agent)技术的发展,去中心化零售生态系统成为可能。本文将系统性地探讨如何构建一个有智能体深度参与的去中心化零售商业模型…

《CPython Internals》阅读笔记:p356-p359

《CPython Internals》学习第 19天,p356-p359 总结,总计 4 页。 一、技术总结 1.benchmark suite The benchmark suite is the tool to use when comparing the complete performance of Python. The Python Benchmark suite is a collection of Python applications design…

昆工昆明理工大学材料25调剂名额

--材测材料物理与化学材料学材料表征与分析材料工程F001现代材料测试技术F002材料成型技术基础864材料科学基础

@FeignClient中configuration属性的简单介绍

第一个控制请求的日志打印级别 先看效果图 日志级别配置方式新增类 public class FeignConfig {/*** NONE【性能最佳,适用于生产】:不记录任何日志(默认值)* BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间* HEADERS:记录BASIC级别的基…

【MySQL】Mysql 加锁机制与死锁分析

一、锁的分类1.1 锁模式1.2 锁粒度1.2.1 全局锁1.2.2 表级锁1.2.3 页级锁1.2.4 行锁1.3 锁范围1.3.1 记录锁1.3.2 间隙锁(Gap)1.3.3 临键锁1.3.4 意向锁(IS、IX)1.4 兼容性二、加锁机制2.1 加锁规则2.2 加锁分析2.2.1 无索引等值查询2.2.2 无索引范围查询2.2.3 无索引未命中…

Linux上安装DVWA,小白也能上手

dvwa是什么? dvwa全称是Damn Vulnerable Web Application,自己翻译吧。 它是一款非常实用的Web应用安全学习和测试平台。那我就在linux上安装下看看。 对了,我这里的linux是centos 7。 首先,dvwa需要什么? 1、数据库:mysql 2、web服务器:我这里选的是apache,而且php还要…

关于pushup与pushdown的几种常见情况

适用于线段树、平衡树等树形结构。 一.区间修改,区间求和(求最值) 二.最大连续子序列 这里有一种类似于 \(DP\) 的方法。 对于一个节点 \(Rt\),我们需要维护四个值。\(sum\) : 此区间的总和。 \(lmx\) : 此区间从左边开头的最大连续子序列。 \(rmx\) : 此区间从右边开头的最…