P9847 [ICPC2021 Nanjing R] Crystalfly 题解 (SPJ)

[ICPC2021 Nanjing R] Crystalfly

传送门?

题面翻译

给定一个 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le10^5) n(1n105) 个节点的树,每个节点上有 a i a_i ai 只晶蝶。派蒙最初在 1 1 1 号节点,并获得 1 1 1 号节点的所有晶蝶,接下来每一秒她可以移动到相邻的节点上并获得节点上的所有晶蝶,但是当她每到达一个节点 u u u 后,对于每个与 u u u 相邻的节点 v v v,节点 v v v 上的的晶蝶会在 t v ( 1 ≤ t v ≤ 3 ) t_v(1\le t_v\le3) tv(1tv3) 秒内消失,在 t v t_v tv 秒后再到达节点 v v v 将无法获得节点上的晶蝶。现在需要你求出最多可以获得的晶蝶数。

题目描述

Paimon is catching crystalflies on a tree, which are a special kind of butterflies in Teyvat. A tree is a connected graph consisting of n n n vertices and ( n − 1 ) (n - 1) (n1) undirected edges.

There are initially a i a_i ai crystalflies on the i i i-th vertex. When Paimon reaches a vertex, she can catch all the remaining crystalflies on the vertex immediately. However, the crystalflies are timid. When Paimon reaches a vertex, all the crystalflies on the adjacent vertices will be disturbed. For the i i i-th vertex, if the crystalflies on the vertex are disturbed for the first time at the beginning of the t ′ t' t-th second, they will disappear at the end of the ( t ′ + t i ) (t' + t_{i}) (t+ti)-th second.

At the beginning of the 0 0 0-th second, Paimon reaches vertex 1 1 1 and stays there before the beginning of the 1 1 1-st second. Then at the beginning of each following second, she can choose one of the two operations:

  • Move to one of the adjacent vertices of her current vertex and stay there before the beginning of the next second (if the crystalflies in the destination will disappear at the end of that second she can still catch them).
  • Stay still in her current vertex before the beginning of the next second.

Calculate the maximum number of crystalflies Paimon can catch in 1 0 1 0 1 0 1 0 10 10^{10^{10^{10^{10}}}} 1010101010 seconds.

输入格式

There are multiple test cases. The first line of the input contains an integer T T T indicating the number of test cases. For each test case:

The first line contains an integer n n n ( 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105) indicating the number of vertices.

The second line contains n n n integers a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots, a_n a1,a2,,an ( 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109) where a i a_i ai is the number of crystalflies on the i i i-th vertex.

The third line contains n n n integers t 1 , t 2 , ⋯ , t n t_1, t_2, \cdots, t_n t1,t2,,tn ( 1 ≤ t i ≤ 3 1 \le t_i \le 3 1ti3) where t i t_i ti is the time before the crystalflies on the i i i-th vertex disappear after disturbed.

For the next ( n − 1 ) (n - 1) (n1) lines, the i i i-th line contains two integers u i u_i ui and v i v_i vi ( 1 ≤ u i , v i ≤ n 1 \le u_i, v_i \le n 1ui,vin) indicating an edge connecting vertices u i u_i ui and v i v_i vi in the tree.

It’s guaranteed that the sum of n n n of all the test cases will not exceed 1 0 6 10^6 106.

输出格式

For each test case output one line containing one integer indicating the maximum number of crystalflies Paimon can catch.

样例 #1

样例输入 #1

2
5
1 10 100 1000 10000
1 2 1 1 1
1 2
1 3
2 4
2 5
5
1 10 100 1000 10000
1 3 1 1 1
1 2
1 3
2 4
2 5

样例输出 #1

10101
10111

提示

For the first sample test case, follow the strategy below.

  • During the 0 0 0-th second
    • Paimon arrives at vertex 1 1 1;
    • Paimon catches 1 1 1 crystalfly;
    • Crystalflies in vertices 2 2 2 and 3 3 3 are disturbed.
  • During the 1 1 1-st second
    • Paimon arrives at vertex 3 3 3;
    • Paimon catches 100 100 100 crystalflies.
  • During the 2 2 2-nd second
    • Paimon arrives at vertex 1 1 1;
    • Crystalflies in vertex 2 2 2 disappears.
  • During the 3 3 3-rd second
    • Paimon arrives at vertex 2 2 2;
    • Crystalflies in vertices 4 4 4 and 5 5 5 are disturbed.
  • During the 4 4 4-th second
    • Paimon arrives at vertex 5 5 5;
    • Paimon catches 10000 10000 10000 crystalflies;
    • Crystalflies in vertex 4 4 4 disappears.

For the second sample test case, the optimal strategy is the same with the first sample test case. Crystalflies in vertex 2 2 2 are scheduled to disappear at the end of the 3 3 3-rd (instead of the 2 2 2-nd) second, allowing Paimon to catch them.

以上来自洛谷 以上来自洛谷 以上来自洛谷

解题思路

好好看题,就知道是树形 d p dp dp。定义 f u , 0 或 1 f_{u,0或1} fu,01 为遍历以 u u u 为根的整棵子树且 u u u 点的子节点的晶蝶消失( f u , 0 f_{u,0} fu,0)或不消失( f u , 1 f_{u,1} fu,1)的情况下所能获得的最大晶蝶数量。记与 u u u 相邻的非父亲节点中 t i = 3 t_i=3 ti=3 的节点晶蝶数量的最大值和第二大值分别为 m a x 1 , m a x 2 max1,max2 max1,max2,若不存在特判即可。
如果当前节点不存在 t i = 3 t_i=3 ti=3 的节点,则 f u , 0 = ( Σ f v , 1 ( v ∈ s o n u ) ) + m a x ( a v ) + f u , 1 = Σ f v , 1 ( v ∈ s o n u ) f_{u,0}=(\Sigma f_{v,1}(v\in son_u))+max(a_v)+f_{u,1}=\Sigma f_{v,1}(v\in son_u) fu,0=(Σfv,1(vsonu))+max(av)+fu,1=Σfv,1(vsonu)
如果当前节点存在 t i = 3 t_i=3 ti=3 的节点,那么通过手动画图观察发现,记所有子节点的 f v , 1 f_{v,1} fv,1 的和 Σ f v , 1 ( v ∈ s o n u ) \Sigma f_{v,1}(v\in son_u) Σfv,1(vsonu) s u m sum sum f u , 0 f_{u,0} fu,0 结果不变, f u , 1 = max ⁡ ⁡ ( f v , 0 + a v + s u m − f v , 1 + m a x 1 , f v , 0 + a v + s u m − f v , 1 + m a x 2 ) f_{u,1}=\max⁡(f_{v,0}+a_v+sum−f_{v,1}+max1,f_{v,0}+a_v+sum−f_{v,1}+max2) fu,1=max(fv,0+av+sumfv,1+max1,fv,0+av+sumfv,1+max2)
最后的答案为 f 1 , 1 + a 1 f_{1,1}+a_1 f1,1+a1​。

AC Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn = 1e5 + 5;
vector<int> g[Maxn];
int n, u, v;
int a[Maxn];
int f[Maxn], sum[Maxn], t[Maxn];
inline void dfs(int u, int fa) {int maxx = 0;multiset<int> st;for (int v : g[u]) {if (v == fa) {continue;}dfs(v, u);sum[u] += f[v];maxx = max(maxx, a[v]);if (t[v] == 3) {st.insert(a[v]);}}f[u] = sum[u] + maxx;st.insert(LONG_LONG_MIN);for (int v : g[u]) {if (v == fa) {continue;}if (t[v] == 3) {st.erase(st.find(a[v]));}f[u] = max(f[u], sum[u] - f[v] + a[v] + sum[v] + *st.rbegin());if (t[v] == 3) {st.insert(a[v]);}}
}
inline void solve() {cin >> n;for (int i = 1; i <= n; i++) {g[i].clear();f[i] = sum[i] = 0;}for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= n; i++) {cin >> t[i];}for (int i = 1; i <= n - 1; i++) {cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1, 0);cout << f[1] + a[1] << endl;
}
inline void work() {int T;cin >> T;while (T--) {solve();}
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);work();return 0;
}

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

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

相关文章

Java设计模式之策略模式详解

Java设计模式之策略模式详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同踏入Java设计模式之策略模式的世界&#xff0c;探讨代码中的…

NetSuite学习笔记 - 中心

一、什么是中心&#xff1f; 对于每个用户&#xff0c;NetSuite 会根据用户的指定角色显示一组可变的标签页面&#xff0c;称为中心。通俗来讲呢&#xff0c;NetSuite的中心其实就是我们常说的“导航菜单”。 只是在我过去常见的系统中&#xff0c;导航菜单一般都是固定的&am…

Elasticsearch Windows部署-ELK技术栈

1、下载Elasticsearch、kibana、logstash 本文不介绍ELK相关原理知识&#xff0c;只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本&#xff0c;这里选择是当前最新版本8.11.3 解压放在同目录下&#xff0c;方便后续操作与使用 …

python 创建虚拟环境

为啥需要创建虚拟环境 在ubuntu直接pip安装的错误&#xff0c;规避自己安装的包与系统使用包之间的冲突 ➜ ~ pip3 install fastapi error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try a…

GPT实战系列-实战Qwen在Cuda 12+24G部署方案

GPT实战系列-实战Qwen在Cuda1224G部署方案 ChatGLM4进行新闻发布&#xff0c;但还没有开源更新&#xff0c;在此之际&#xff0c;实战部署测试Qwen大模型。目前Qwen的口碑貌似还不错&#xff0c;测试显卡内存24G&#xff0c;毕竟有限&#xff0c;排除了Qwen14非量化方案Qwen-1…

浅入浅出Spring架构设计

浅入浅出Spring架构设计 前言 为什么需要Spring? 什么是Spring? 对于这样的问题&#xff0c;大部分人都是处于一种朦朦胧胧的状态&#xff0c;说的出来&#xff0c;但又不是完全说的出来&#xff0c;今天我们就以架构设计的角度尝试解开Spring的神秘面纱。 本篇文章以由浅…

RK3566 linux加入uvc app

SDK中external/uvc_app/目录提供了将板卡模拟成uvc camera的功能。 一、buildroot使能uvc_app 1、进入到buildroot目录 在sdk目录下执行以下命令&#xff1a; cd buildroot 2、选择defconfig 执行命令&#xff1a; source build/envsetup.sh 输入数字然后回车选择板卡&…

【Vue3】3-4 : 组件的属性与事件是如何进行处理的

有时候组件上的属性或事件并不想进行组件通信&#xff0c;那么Vue是如何处理的呢&#xff1f; 组件的属性与事件 默认不通过props接收的话&#xff0c;属性会直接挂载到组件容器上&#xff0c;事件也是如此&#xff0c;会直接挂载到组件容器上。可通过 inheritAttrs 选项阻止…

Java中Redis常用的20个方法

开头语&#xff1a; 大家好&#xff01;欢迎来到本篇博客&#xff0c;今天我们将探讨Java中Redis的常用方法。作为一种强大的缓存和数据存储工具&#xff0c;Redis在Java应用中扮演着重要的角色。我们将介绍20个常用的Redis方法&#xff0c;希望对大家在Java开发中更好地使用R…

两数之和(Hash表)[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找出"和"为目标值target的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元…

HC小区管理系统商用测试用例

HC小区管理系统商用测试用例 说明 HC小区管理系统商用之前&#xff0c;必须要经过严格的测试&#xff0c;可能因为环境差异&#xff0c;以及配置差异等导致生产环境不稳定&#xff0c;或者存在系统bug。 1.1、操作视频 hc_java110的个人空间-hc_java110个人主页-哔哩哔哩视…

Spark—shell,Hbase—shell

Spark&#xff1a; SPARK SQL results spark.sql( "SELECT * FROM people") //读取JSON文件 val userScoreDF spark.read.json("hdfs://master:9000/people.json") Spark内置函数的使用 除select()外&#xff0c;还可以使用filter()、groupBy()等方…

工具推荐 |Devv.ai — 最懂程序员的新一代 AI 搜索引擎

介绍 伴随 GPT 的出现&#xff0c;我们可以看到越来越多的 AI 产品&#xff0c;其中也不乏针对程序员做的代码生成工具。 今天介绍的这款产品是一款针对中文开发者的 AI 搜索引擎&#xff0c;Devv.ai 使用 Devv.ai 的使用非常简单&#xff0c;就是传统的搜索场景&#xff…

pexpect中interact模式的坑

截止写这篇博文为止&#xff0c;根据官方文档&#xff0c;调用interact模式时需要将logfile设置为None&#xff0c;否则日志会在终端显示两次&#xff08;logfile_read一次&#xff0c;logfile一次&#xff09;&#xff0c;将logfile_read或者logfile_send设置为None是无效的&a…

JVM:类加载机制

JVM&#xff1a;类加载机制 1. 什么是类加载机制2. 类加载的过程(生命周期)2.1 加载2.2 校验&#xff08;验证&#xff09;2.3 准备2.n 六种情况对类进行“初始化” 1. 什么是类加载机制 Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析…

数字化赋能TPM:开启智能生产新篇章

随着科技的快速发展&#xff0c;数字化已经成为企业提升生产效率、优化管理的重要手段。对于设备密集型的制造业而言&#xff0c;传统的TPM&#xff08;全员生产维护&#xff09;方式已经难以满足现代生产的需求。如何将数字化技术与TPM相结合&#xff0c;赋能TPM&#xff0c;提…

机器学习:线性回归模型的原理、应用及优缺点

一、原理 线性回归是一种统计学和机器学习中常用的方法&#xff0c;用于建立变量之间线性关系的模型。其原理基于假设因变量&#xff08;或响应变量&#xff09;与自变量之间存在线性关系。 下面是线性回归模型的基本原理&#xff1a; 模型拟合&#xff1a; 通过最小二乘法&…

后端怎样防止重复提交订单?

参考文章 通常我们可以在前端通过防抖和节流来解决短时间内请求重复提交的问题&#xff0c; 如果因网络问题、Nginx重试机制、微服务Feign重试机制或者用户故意绕过前端防抖和节流设置&#xff0c;直接频繁发起请求&#xff0c;都会导致系统防重请求失败&#xff0c;甚至导致后…

2024华数杯国际数学建模B题思路+代码+模型+论文

2024华数杯国际数学建模B题思路代码模型论文&#xff1a;1.17上午第一时间更新&#xff0c;详细内容见文末名片 问题B&#xff1a;光伏电 背景 中国的电力构成包括传统的能源发电&#xff08;如煤炭、石油和天然气&#xff09;、可再生能源发电 &#xff08;如水力发电、风能…

微信小程序跳转的几种方式

微信小程序中页面跳转方法的灵活运用不仅可以提升用户体验&#xff0c;还能为应用增添更多创意和吸引力。 方式一&#xff1a;wx.navigateTo 保留当前页面&#xff0c;跳转到应用内的某个页面 。示例&#xff1a; wx.navigateTo({url: ../details/details })使用场景 适用于…