24 Hongkong B and 2023 ICPC Shenyang

news/2025/10/18 1:03:55/文章来源:https://www.cnblogs.com/Young-Cloud/p/19149073

24 Hongkong B and 2023 ICPC Shenyang

24 Hongkong B

我们能造成的伤害范围比较小,考虑从这一点入手。如果每次都造成 1 点伤害,则 \(max\{a_i + b_i\}\) 次后就能击败所有敌人,最后造成 \(max\{a_i + b_i\}\) 点伤害,这是造成总伤害的最小值。在破甲和击杀时,对于非 1 的伤害,都有可能溢出,两次溢出最多溢出 \(2k\) 点伤害,考虑破甲的溢出,当造成的总伤害超过 \(max\{a_i + b_i\} + k\) 时,必然会击败所有对手,但是再考虑击败时的溢出,我们最后造成的总伤害可能会达到 \(max\{a_i + b_i\} + 2k\)。也就是说,我们最后造成的总伤害的范围是小的。

这启事我们可以枚举最后造成的总伤害算最小代价和方案数。具体得,设我们确定造成得总伤害为 \(s\),若当前已造成了 \(x\) 点伤害,下一步我想造成 \(y\) 点伤害,则会对护盾值 \(\in (x, x + y]\) 范围内的敌人造成破甲,此时若想后续伤害 \(s - x - y\) 仍有可能击败所有敌人,就需要 \(s - x - y\) 大于护盾值 \(\in (x, x + y]\) 的敌人的最高血量。于是就可以根据这个约束来 dp

int n, m, k;
int a[N + 5], b[N + 5];
// hp[i] 护盾值为 i 的敌人的最高血量
int hp[S];
i64 cost[K + 5];// 最小代价、方案数
i64 f[S + 5], g[S +  5];void add(i64 &a, i64 b) {a += b;if (a >= Mod) {a -= Mod;}
}std::array<i64, 2> get(int s) {for (int i = 0; i <= s; ++i) {f[i] = Inf;g[i] = 0ll;}f[0] = 0ll;g[0] = 1ll;for (int i = 0; i <= s; ++i) {int mx = 0;for (int j = 1; j <= k && i + j <= s; ++j) {mx = std::max(mx, hp[i + j]);// 剩余的伤害要大于血量if (s - (i + j) < mx) {break;}i64 val = f[i] + cost[j];if (val == f[i + j]) {add(g[i + j], g[i]);}if (val < f[i + j]) {f[i + j] = val;g[i + j] = g[i];}}}return { f[s], g[s] };
}void solve() {std::cin >> n >> m;for (int i = 0; i < n; ++i) {std::cin >> a[i];}for (int i = 0; i < n; ++i) {std::cin >> b[i];}std::cin >> k;for (int i = 1; i <= k; ++i) {std::cin >> cost[i];}int mx = 0;for (int i = 0; i < n; ++i) {mx = std::max(a[i] + b[i], mx);}for (int i = 1; i <= k + k + mx; ++i) {hp[i] = 0;}for (int i = 0; i < n; ++i) {hp[b[i]] = std::max(hp[b[i]], a[i]);}i64 mn = Inf;i64 cnt = 0;// 枚举总伤害for (int i = mx; i <= k + k + mx; ++i) {auto [fs, gs] = get(i);if (fs == mn) {add(cnt, gs);}if (fs < mn) {mn = fs;cnt = gs;}}std::cout << mn << ' ' << cnt << '\n';
}

23 Senyang

E

数据范围非常的小啊,所有的状态,加上状态之间可能的转移也就 \(n^4\),所以直接 bfs 爆搜

void solve() {int x = 0, y = 0, p = 0, q = 0;std::cin >> x >> y >> p >> q;int ans = Inf;std::queue<std::array<int, 4>> que;que.push({ x, y, 0, 0 });vis[x][y][0] = true;while (not que.empty()) {auto [ux, uy, side, d] = que.front();que.pop();if (ux == 0 && side == 1) {ans = std::min(ans, d);}// 在家一侧if (side == 1) {for (int dx = 0; dx + ux <= x; ++dx) {for (int dy = 0; dy + uy <= y; ++dy) {if (dx + dy > p) {break;}// 家对岸int vx = ux + dx;int vy = uy + dy;// 家int hx = x - vx;int hy = y - vy;if ((hx != 0 && hy > hx + q) || vis[vx][vy][0]) {continue;}que.push({ vx, vy, 0, d + 1 });vis[vx][vy][0] = true;}}}// 在对岸else {for (int dx = 0; dx <= ux; ++dx) {for (int dy = 0; dy <= uy; ++dy) {if (dx + dy > p) {break;}// 家对岸int vx = ux - dx;int vy = uy - dy;// 家int hx = x - vx;int hy = y - vy;if ((vx != 0 && vy > vx + q) || vis[vx][vy][1]) {continue;}que.push({ vx, vy, 1, d + 1 });vis[vx][vy][1] = true;}}}}std::cout << (ans == Inf ? -1 : ans) << '\n';
}

J

考虑什么样的边不能操作,可以发现与叶子相连的边不能选,对与叶子相连的边镜像进行一次操作相当于交换了叶子和他的父亲,树的形态仍保持不变。其次能够操作的边最多只能操作一次,因为操作一次之后,所选的那条边就与叶子相邻了。所以只用看可操作边的奇偶就好了。

K

能够更新的最多次数是好求的:把所有的正数调整到非正数前面,操作次数就是正数的数量。对于最少次数,只需要把所有非正数放在正数前面,并将正数排成升序,这样能让分数大于 0 后,剩下的正数尽可能少,也就是更新的次数尽可能少,假设正数的数量是 \(x\),对正数升序排序后,第一个让分数大与 0 的正数是 \(k\),则答案就是 \(x - (x - k) = k\),也就是找到 \(k\) 就行了。线段树上二分易解:


struct Info {int num;i64 sum;Info *l, *r;Info() : num(0), sum(0), l(nullptr), r(nullptr) {}~Info() {if (!l) {delete l;l = nullptr;}if (!r) {delete r;r = nullptr;}}
} *root = nullptr;int a[N + 5];void add(Info *&cur, int l, int r, int pos, int val) {if (!cur) {cur = new Info();}cur->num += val;cur->sum += 1ll * pos * val;if (l == r) {return;}int m = l + r >> 1;if (pos <= m) {add(cur->l, l, m, pos, val);}else {add(cur->r, m + 1, r, pos, val);}
}int upper_bound(Info *&cur, int l, int r, i64 val) {if (!cur) {return 0;}if (l == r) {return val / l;}int lnum = 0;i64 lsum = 0ll, rsum = 0ll;if (cur->l) {lsum = cur->l->sum;lnum = cur->l->num;}if (cur->r) {rsum = cur->r->sum;}int m = l + r >> 1;if (lsum > val) {return upper_bound(cur->l, l, m, val);}else {return lnum + upper_bound(cur->r, m + 1, r, val - lsum);}
}void solve() {int n = 0, q = 0;std::cin >> n >> q;i64 neg = 0;for (int i = 1; i <= n; ++i) {std::cin >> a[i];if (a[i] > 0) {add(root, 1, Inf, a[i], 1);}else {neg -= a[i];}}while (q--) {int idx = 0, val = 0;std::cin >> idx >> val;if (a[idx] > 0) {add(root, 1, Inf, a[idx], -1);}else {neg += a[idx];}a[idx] = val;if (a[idx] > 0) {add(root, 1, Inf, a[idx], 1);}else {neg -= a[idx];}std::cout << upper_bound(root, 1, Inf, neg) + 1 << '\n';}
}

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

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

相关文章

应急响应-vulntarget-k-03

应急响应-vulntarget-k-03 这里通过history查看历史命令看到在这里进入了/opt下面创建了一个隐藏文件 .a 我们跟跟踪过去看看在这里有个程序start.sh 看这个隐藏目录下面有一个sendPacket.py ./sendPacket.py 192.168.…

共识的预锚点:AI元人文中的价值原语引导与自动化演进

共识的预锚点:AI元人文中的价值原语引导与自动化演进 我: 在价值原语博弈开始前,我们是否可以先开发一个引导环节,借助大模型为具体冲突预生成可能涉及的价值原语清单? 你: 这个想法非常关键!它解决了价值博弈的…

winserver备份到miniio

winserver 安装openssh备份代码 package org.hf.ywyt_minio.openssh;import com.jcraft.jsch.*; import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.…

软考中级 学习总结*(1)

一. 1.计算机由运算器,控制器,存储器,输入设备,输出设备组成 中央处理单元CPU CPU获取程序指令,并进行译码,也就是执行程序。 一个程序由多个指令组成 CPU功能:控制器:程序控制,操作控制,时间控制 运算器(…

【黑马python】基础 6.Python 容器:列表 元组 字符串 集合 字典

笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 数据容器代码示例参考链接黑马-6.Python 容器 01-数据容器入门TBD

刷题日记—数字读取与判断

今天做了洛谷上有关统计数字个数的题,如下 这道题让我们统计在1到n的数中,给定数字x的出现次数,所以要考虑每一位上该数字出现的个数。对于这种读取每个数位上的数字,我们一般用% /结构。 即先让b=i,拷贝当前数值,…

Linux Mint -- LMDE6升级到LMDE7

Linux Mint -- LMDE6升级到LMDE72025年10月15日,LMDE7 Gigi版本正式发布了!!该操作系统我之前文章写过推荐的理由及该系统推荐的软件,有兴趣的点击此链接去看一下Linux Mint操作系统推荐。如下再介绍两种安装的方式…

OI 笑传 #19

Shinshiro今天是一些 CF。 CF2152D 除二加一什么的当然要放到二进制上。 如果没有小 R,那么操作的次数就是二进制位数减一加起来。 观察一下发现小 R 的加一是很弱小的,因为小 P 除二可以把整个二进制往下拉(右移)…

CF1133 合集

云落碎碎念题面翻译取自 luogu,本蒟蒻也会安置原题链接 不保证文章中不出现“显然”或者“注意到”,可能会出现“易证” 有写错的地方欢迎各位神犇指正前言 随机到一套 Div 3,愉悦一下身心 CF1133A 题解 题目传送门…

Note of Michael Artin Algebra Chapter 6 Symmetry (to complete)

6.1 SYMMETRY OF PLANE FIGURES Bilateral, rotational, translational, glide symmetry, and their combinations. 6.2 ISOMETRIES 6.2.1 Def. (Distance, Isometry) The distance between points of \(\mathbb{R}^n\…

10/18

学了外教课

实验一 现代C++基础编程

#任务1 ##代码 代码1// 现代C++标准库、算法库体验 // 本例用到以下内容: // 1. 字符串string, 动态数组容器类vector、迭代器 // 2. 算法库:反转元素次序、旋转元素 // 3. 函数模板、const引用作为形参 #include <…

CF1824D 题解

求 \(\sum\limits _ {i = l} ^ r \sum\limits _ {j = x} ^ y g(i,j)\)。 离线询问,扫描线 \(j\),线段树维护 \(g(i)\),那么,转换为求解 \(x\) 时刻到 \(y\) 时刻,线段树区间 \([l,r]\) 的区间和的历史和。 考虑扫…

CF1059 Codeforces Round 1059 (Div. 3) 游记

一次值得记录的失败。用以勉励。省流 一次值得记录的失败。用以勉励。10.17 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 非常困,回寝室睡了一会,再来就迟到了。于是一边安慰自己不算分一边想着还是写一下不…

newDay12

1.今天主要是合唱现场去演出,写写作业,背单词 2.明天时间多,多学学 3.睡得太晚了,导致醒来也已经很晚,时间管控不太好

PyTorch与卷积神经网络读书报告

PyTorch与卷积神经网络读书报告 近期,我观看了B站上适合新手的卷积神经网络(CNN)原理详解视频,并结合PyTorch相关知识进行学习,对CNN在PyTorch中的应用有了更深入的认识。 一、CNN核心原理 CNN通过卷积层用卷积核…

QOJ857 Social Distancing

题意简述 给定一颗 \(n\) 个点的树,和它的两个大小为 \(k\) 的独立集 \(A, B\)。 在一次操作中,可以选择一条树边 \((u, v)\),满足 \(u\in A\land v\notin A\),并使 \(A\leftarrow (A − \{u\})\cup\{v\}\)。同时,…

10.17日学习笔记

HBase + Flink 实时增量同步 CDC 方案选型 采用 Flink-HBase-Connector 2.2(基于 AsyncTableOperator),源库 MySQL 8.0,Binlog Row 模式。 作业拓扑 MySQL → Debezium JSON → Kafka → Flink SQL → HBase Flink…

KV缓存(Key-Value Cache)

2025.10.17 1.KV缓存(Key-Value Cache)是大语言模型推理优化中的一项技术,主要用于存储注意力机制中先前计算的键(Key)和值(Value)矩阵,以避免在生成每个新token时重复计算整个序列,从而加速解码过程并减少响…