洛谷链接

题目

Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To search for Zane, he would need a lot of money, of which he sadly has none. To deal with the problem, he has decided to hack the banks.

There are n banks, numbered from 1 to n. There are also n - 1 wires connecting the banks. All banks are initially online. Each bank also has its initial strength: bank i has initial strength a i.

Let us define some keywords before we proceed. Bank i and bank j are neighboring if and only if there exists a wire directly connecting them. Bank i and bank j are semi-neighboring if and only if there exists an online bank k such that bank i and bank k are neighboring and bank k and bank j are neighboring.

When a bank is hacked, it becomes offline (and no longer online), and other banks that are neighboring or semi-neighboring to it have their strengths increased by 1.

To start his plan, Inzane will choose a bank to hack first. Indeed, the strength of such bank must not exceed the strength of his computer. After this, he will repeatedly choose some bank to hack next until all the banks are hacked, but he can continue to hack bank x if and only if all these conditions are met:

  1. Bank x is online. That is, bank x is not hacked yet.
  2. Bank x is neighboring to some offline bank.
  3. The strength of bank x is less than or equal to the strength of Inzane's computer.

Determine the minimum strength of the computer Inzane needs to hack all the banks.

给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权

输入格式

The first line contains one integer \(n (1 ≤ n ≤ 3·10^5)\) — the total number of banks.

The second line contains \(n\) integers \(a_1, a_2, ..., a_n ( - 10^9 ≤ a i ≤ 10^9)\) — the strengths of the banks.

Each of the next n - 1 lines contains two integers \(u_i\) and \(v_i (1 ≤ u_i, v_i ≤ n, u_i ≠ v_i)\) — meaning that there is a wire directly connecting banks \(u_i\) and \(v_i\).

输出格式

Print one integer — the minimum strength of the computer Inzane needs to accomplish the goal.

It is guaranteed that the wires connect the banks in such a way that Inzane can somehow hack all the banks using a computer with appropriate strength.

题解

给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权

这是洛谷上的翻译, 很简洁明了.

这道题直接遍历一遍树, 按照题意统计一下就好了.

输入的时候先求出点权的最大值和每个权值的个数, 然后遍历每一个节点, 每个节点遍历每一个子节点, 根据题目性质计算即可.

代码


#include <bits/stdc++.h>
using namespace std;
struct Edge { int to, next; } edges[600010];
int n, tot, ans, maxv = -0x3f3f3f3f, flag, x, y, a[300010], head[300010];
map<int, int> m;
void add(int x,int y) { edges[++tot] = (Edge){y, head[x]},head[x] = tot; }
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]), m[a[i]]++, maxv = max(maxv, a[i]);
ans = maxv + 2;
for (int i = 1; i < n; i++) scanf("%d%d", &x, &y), add(x,y), add(y,x);
for (int i = 1; i <= n; i++) {
flag = 0;
for (int j = head[i]; j; j = edges[j].next) {
m[a[edges[j].to]]--;
if (a[edges[j].to] == maxv) flag = 1;
}
if (!m[maxv]) ans = maxv + 1;
if (maxv == a[i] && m[maxv] == 1) {
if (m[maxv - 1] || flag) // 其它节点有ans-1的权值,-1+2=+1 或者 子节点中也有最大值,子节点+1后是答案
ans = maxv + 1;
else {
ans = maxv; // 根节点是最大值, 并且子树中没有更大的, 直接break
break;
}
}
for (int j = head[i]; j; j = edges[j].next) m[a[edges[j].to]]++;
}
printf("%d\n", ans);
return 0;
}

CF796C Bank Hacking 题解的更多相关文章

  1. CF796C Bank Hacking 思维

    Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To search f ...

  2. CF796C Bank Hacking 细节

    思路十分简单,答案只有 3 种可能,但是有一些细节需要额外注意一下. code: #include <bits/stdc++.h> #define N 300002 #define set ...

  3. Bank Hacking题解

    题目: 题意: 有一颗树,你可以断开点(第一个随便断,以后只能是和已经断开的点相临的点),每个点有权值,断开之后,经一条边和两条边可以到达的节点权值加一,问到最后出现过的最大的权值. 分析: 为啥断开 ...

  4. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  5. Code Forces 796C Bank Hacking(贪心)

    Code Forces 796C Bank Hacking 题目大意 给一棵树,有\(n\)个点,\(n-1\)条边,现在让你决策出一个点作为起点,去掉这个点,然后这个点连接的所有点权值+=1,然后再 ...

  6. codeforce 796C - Bank Hacking(无根树+思维)

    题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To searc ...

  7. CodeForces - 796C Bank Hacking

    思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...

  8. Codeforces Round #408 (Div. 2)C. Bank Hacking(STL)

    题目链接:http://codeforces.com/problemset/problem/796/C 题目大意:有n家银行,第一次可以攻击任意一家银行(能量低于自身),跟被攻击银行相邻或者间接相邻( ...

  9. Codeforces Round #408 (Div. 2) C. Bank Hacking

    http://codeforces.com/contest/796/problem/C Although Inzane successfully found his beloved bone, Zan ...

随机推荐

  1. python3 修改计算机名称GUI程序

    from tkinter import *from tkinter import messageboximport tkinterimport winregimport osdef serch(): ...

  2. 05-IntentFilter的匹配规则

    IntentFilter的匹配规则 原则上一个Intent不应该既是显示调用又是隐式调用,如果二者共存的话以显式调用为主 隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过 ...

  3. 宝塔面板如何有效的清除SSL证书以及缓存

    一:关闭SSL 我们先关闭SSL证书,这个大家都会的吧.如图: 二:证书夹 网站配置的证书夹,我们删除掉,如图: 三:寻找SSL证书路径 网站配置里有一路径我们看下:如下 ssl_certificat ...

  4. 让LED程序在片外SDRAM中运行

    让LED程序在片外SDRAM中运行 一.引子 在前一篇文章中,我们已经成功点亮过LED了,为什么还要再重复一次呢? 我们已经知道,Mini2440开发板有两种启动模式:从NorFlash启动和从Nan ...

  5. c++ vector基本函数、排序、查找用法

    vector用法目录: 1.基本用法 2.vector的删除操作 3.vector的sort排序 4.翻转vector中的所有元素 5.find()函数的用法 6.vector实战(这里写的是我在最开 ...

  6. CentOS Linux release 7.7.1908 (Core)--redis安装

    1.通过filezilla把安装包扔到linux上,建立一个redis 的目录 2.解压 tar -zxvf redis-4.0.6.tar.gz 3. yum安装gcc依赖  yum install ...

  7. LaTeX常用符号(持续更新)

    参考网址:https://qianwenma.cn/2018/05/17/mathjax-yu-fa-can-kao/# 基本运算 1.乘法$x\times y$ x\times y 2.乘法$x^{ ...

  8. VSCode + WSL 2 + Ruby环境搭建详解

    vscode配置ruby开发环境 vscode近年来发展迅速,几乎在3年之间就抢占了原来vim.sublime text的很多份额,犹记得在2015-2016年的时候,ruby推荐的开发环境基本上都是 ...

  9. 记录一次Flink作业异常的排查过程

    最近2周开始接手apache flink全链路监控数据的作业,包括指标统计,业务规则匹配等逻辑,计算结果实时写入elasticsearch. 昨天遇到生产环境有作业无法正常重启的问题,我负责对这个问题 ...

  10. cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发

    /*cb04a_c++_数据结构_STL_queue队列-一般用来做系统软件开发队列(只能两端数据)与堆栈(只能一端操作数据)都没有迭代器.,队列:FIFO先进先出自适应容器(容器适配器)栈适配器ST ...