2024初秋集训——提高组 #32

news/2024/10/7 19:36:29/文章来源:https://www.cnblogs.com/yaosicheng124/p/18450473

B. 序列删除

题目描述

有一个长度为 \(2N\) 的序列 \(A\),其中 \(1\)\(N\) 恰好出现两次。你每次可以选择两个相同的数 \(A_l,A_r(l<r)\) 并花费 \(r-l\) 的代价将其删除。求将整个序列删空的最小代价。

思路

有一个很显然的贪心就是:每次取代价最小的两个数删除。所以我们按照代价排序,用树状数组维护区间中未被删除的数的数量即可。

空间复杂度 \(O(N)\),时间复杂度 \(O(N\log N)\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;const int MAXN = 200001, MAXV = (1 << 20);struct Node {int l, r;
}s[MAXN];int n, a[MAXN], l[MAXN], tr[MAXN];
ll ans;void update(int p, int x) {for(; p <= 2 * n; tr[p] += x, p += (p & -p)) {}
}int Getsum(int p) {int sum = 0;for(; p; sum += tr[p], p -= (p & -p)) {}return sum;
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n;for(int i = 1; i <= 2 * n; ++i) {cin >> a[i];if(!l[a[i]]) {l[a[i]] = i;}else {s[a[i]] = {l[a[i]], i};}}sort(s + 1, s + n + 1, [](const Node &a, const Node &b) -> bool {return a.r - a.l < b.r - b.l;});for(int i = 1; i <= n; ++i) {ans += s[i].r - s[i].l - Getsum(s[i].r) + Getsum(s[i].l);update(s[i].l, 1), update(s[i].r, 1);}cout << ans;return 0;
}

C. 史莱姆融合

题目描述

在一棵 \(N\) 个结点的树上,有 \(k\) 只史莱姆,一开始在结点 \(id_i\),体积为 \(v_i\)。它们会如下行动:

  • 如果一只史莱姆通过了边权为 \(w\) 的边,则其体积减 \(w\)。若其体积变为非正数,则其消失。
  • 如果多只史莱姆待在同一个结点,则它们将会合并为体积为其体积之和的史莱姆。
  • 史莱姆最终都要到达一个结点 \(c\),但它们会按最优方案行动。

\(q\) 次查询,每次查询如果史莱姆要到达 \(c\),且你一开始可以让 \(num(num\in \{0,1\})\) 个史莱姆消失时最终史莱姆的最小体积。

思路

我们先只考虑 \(c=1\) 的情况,那么我们可以令 \(dp_{0/1,u}\) 表示在 \(u\) 子树内删除了 \(0/1\) 个史莱姆,最终子树内的史莱姆到达 \(u\) 的体积。对于 \(dp_{0,u}\),显然有转移 \(dp_{0,u}=\sum \limits_{(v,w)\in son_u} \max(0,dp_{0,v}-w)\)。而对于 \(dp_{1,u}\),我们可以选择删掉这个结点本身的,也可以选择一个儿子子树删,也就是 \(dp_{1,u}=\min (\max(0,dp_{0,u}-w),\min\limits_{v_0\in son_u} \{\max(0,dp_{1,v_0})+\sum \limits_{v\in son_u\and v\ne v_0}\max(0,dp_{0,v})\})\)

接着我们考虑换根,\(dp_{0,u}\) 的换根很简单,但 \(dp_{1,u}\) 比较麻烦。如果 \(v\) 不是 \(dp_{1,u}\) 转移时最小的那个 \(v_0\),那么可以直接转移。否则必须从次小值转移过来,所以这里还需要记录次小值。

空间复杂度 \(O(N)\),时间复杂度 \(O(N+K+Q)\)

代码

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;const int MAXN = 100001;
const ll INF = (ll)(1e18);int n, k, q, a[MAXN], son[MAXN];
ll dp[3][MAXN];
vector<pii> e[MAXN];void dfs(int u, int fa) {dp[0][u] = a[u];for(pii g : e[u]) {int v = g.first, w = g.second;if(v != fa) {dfs(v, u);dp[0][u] += max(0ll, dp[0][v] - w);}}dp[1][u] = dp[0][u] - a[u], dp[2][u] = INF, son[u] = u;for(pii g : e[u]) {int v = g.first, w = g.second;if(v != fa) {ll x = dp[0][u] - max(0ll, dp[0][v] - w) + max(0ll, dp[1][v] - w);if(x < dp[1][u]) {dp[2][u] = dp[1][u], dp[1][u] = x, son[u] = v;}else if(x < dp[2][u]) {dp[2][u] = x;}}}
}void DFS(int u, int fa) {for(pii g : e[u]) {int v = g.first, w = g.second;if(v != fa) {ll v0 = dp[0][v], u0 = dp[0][u] - max(0ll, v0 - w);dp[0][v] += max(0ll, u0 - w);dp[1][v] += max(0ll, u0 - w);dp[2][v] += max(0ll, u0 - w);if(son[u] != v) {ll x = dp[0][v] - max(0ll, u0 - w) + max(0ll, dp[1][u] - max(0ll, v0 - w) - w);if(x < dp[1][v]) {dp[2][v] = dp[1][v], dp[1][v] = x, son[v] = u;}else if(x < dp[2][v]) {dp[2][v] = x;}}else {ll x = dp[0][v] - max(0ll, u0 - w) + max(0ll, dp[2][u] - max(0ll, v0 - w) - w);if(x < dp[1][v]) {dp[2][v] = dp[1][v], dp[1][v] = x, son[v] = u;}else if(x < dp[2][v]) {dp[2][v] = x;}}DFS(v, u);}}
}int main() {ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> k >> q;for(int i = 1, u, v, w; i < n; ++i) {cin >> u >> v >> w;e[u].emplace_back(v, w);e[v].emplace_back(u, w);}for(int i = 1, u; i <= k; ++i) {cin >> u >> a[u];}dfs(1, 0);DFS(1, 0);for(int i = 1, u, v; i <= q; ++i) {cin >> u >> v;cout << dp[v][u] << "\n";}return 0;
}

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

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

相关文章

高级程序语言第二次个人作业

高级程序语言第二次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2024C/homework/13282学号 222200424姓名 赵伟豪编程练习3.13.23.33.43.53.63.73.8示例程序3.13.23.33.43.53.63.73.83.93.10总结与收获…

浏览器的渲染原理

浏览器渲染原理 五个渲染流程Parse 阶段:解析 HTMLStyle 阶段:样式计算三个阶段:收集,划分和索引所有样式表中存在的样式规则 访问每个元素并找到适用于该元素的所有规则,CSS 引擎遍历 DOM 节点,进行选择器匹配,并且匹配的节点执行样式设置 结合层叠规则和其他信息为节点…

CSP2024 前集训:多校A层冲刺NOIP2024模拟赛03

前言T1 没想到正难则反,脑瘫了没敢用 bitset(复杂度擦边但卡常能过),T2 空间开大了挂了 \(100pts\),\(T3\) 是原。 T1 五彩斑斓部分分 \(20pts\):\(O(n^4)\) 暴力。部分分 \(20+?pts\):进行一些优化,极限数据下仍是 \(O(n^4)\)。部分分 \(60\sim 100pts\):bitset 优化…

在C#中使用适配器Adapter模式和扩展方法解决面向的对象设计问题

之前有阵子在业余时间拓展自己的一个游戏框架,结果在实现的过程中发现一个设计问题。这个游戏框架基于MonoGame实现,在MonoGame中,所有的材质渲染(Texture Rendering)都是通过SpriteBatch类来完成的。举个例子,假如希望在屏幕的某个地方显示一个图片材质(imageTexture)…

React Fiber 原理

React Fiber 在 React 16 之前的版本对比更新 VirtualDOM 的过程是采用 Stack 架构实现的,也就是循环加递归,这种方式的问题是一旦任务开始进行就无法被中断。 如果应用中的组件数量庞大, Virtual DOM 的层级比较深,主线程被长期占用,知道整颗 Virtual DOM 树比对更新完成…

视野修炼-技术周刊第104期 | 下一代 JavaScript 工具链

① 🐙 尤大创办公司 VoidZero ② Tauri 2.0 稳定版发布 ③ Vite 时髦的新主页 ④ qrframe - 漂亮二维码生成 ⑤ HTTP QUERY 方法提案 ⑥ TinyJS - 轻量级的创建DOM元素 ⑦ 9月 Web 平台的新功能 ⑧ ESLint 现在正式支持 Linting JSON 和 Markdown欢迎来到第 104 期的【视野修…

雅礼国庆集训 day1 T2 折射

题面 题面下载 算法 转化题意 说白了就是给了你一堆点,让你数这种折线有多少个 (严格向下走,并且横坐标之间的差越来越小)看着像一种在 y 轴方向排序的 dp 但是由于是折线, 所以需要加一维来判断转向 dp 设计 状态设计 \(dp_{i, 0/1}\) 表示第 i 个点, 是向左下还是右上 状态…

React 中的 diff 算法

React diff为什么使用虚拟 DOM ? 浏览器在处理 DOM 的时候会很慢,处理 JavaScript 会很快,页面复杂的时候,频繁操作 DOM 会有很大的性能开销(每次数据变化都会引起整个 DOM 树的重绘和重排)。 为了避免频繁操作 DOM,React 会维护两个虚拟 DOM,如果有数据更新,会借此计…

20222315 2024-2025-1 《网络与系统攻防技术》实验一实验报告

1.实验内容 1.掌握反汇编与十六进制编程器 2.能正确修改机器指令改变程序执行流程 3.能正确构造payload进行bof攻击 2.实验过程 1.直接修改程序机器指令,改变程序执行流程 将pwn1文件下载至kali中并将pwn1文件改名为pwn20222315,并将其内容复制到pwn2反汇编文件objdump -d…

多校A层冲刺NOIP2024模拟赛03

多校A层冲刺NOIP2024模拟赛03\(T1\) A. 五彩斑斓(colorful) \(90/100pts\)部分分\(20pts\) :枚举左上 \((k,h)\) 、右下端点 \((i,j)\) ,时间复杂度为 \(O(n^{2}m^{2})\) 。 \(90/100pts\) :当 \(a_{i,j} \ne a_{k,j}\) 时任意的 \(h \in [1,j]\) 都符合题意、不妨钦定 \(…

Word中 Endnote 引用标蓝色

1. 打开word中的endnote加载项。如图所示,勾选这两个设置。 确认后会自动变为超链接,显示蓝色以及下划线。 2. 在样式设置中,将超链接的下划线取消。之后就会只显示蓝色引用。 结果显示: