题目大意

洛谷链接

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

其他见链接(懒)。

PS:原题面很不好总结题意,洛谷的翻译的确很清楚。

思路

先枚举最大点权设为\(v_{max}\)。

  • 若最大点权的点只有一个

    • 若没有\(v=v_{max}-1\)的点,答案即为\(v_{max}\)
    • 若存在且为最大权值点的子节点,答案为\(v_{max}-1+1=v_{max}\)
    • 若存在且不是最大权值点的子节点,答案为\(v_{max}-1+2=v_{max}+1\)
  • 若最大点权的点不止一个
    • 若其他最大点权的点都是一个最大点权的点的子节点,答案为\(v_{max}+1\)
    • 若所有最大点权的点都是一个点的子节点,答案为\(v_{max}+1\)
    • 若都不是,则答案为\(v_{max}+2\)

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=300000+10;
const int INF=0x3f3f3f3f;
struct node{
int to,nxt;
}e[maxn*2];
int n,ans,vmax=-INF,a[maxn];
bool flag;
map<int,int> mp;//不能用数组!否则会RE,因为存在负权 int cnt,head[maxn];
void add(int x,int y){
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;//记录权值出现次数
vmax=max(vmax,a[i]);//找最大点权
} ans=vmax+2;
for(int i=1;i<n;i++){
int x,y;
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=e[j].nxt){
mp[a[e[j].to]]--;//儿子权值次数--
if(a[e[j].to]==vmax)flag=1;//flag为1表示儿子中有最大权值
}
if(!mp[vmax])ans=vmax+1;//所有最大权值点都是一个点的儿子
if(vmax==a[i]&&mp[vmax]==1){//最大值是根
if(mp[vmax-1])ans=vmax+1;//存在非儿子的权值为vmax-1的点,加2,得到的是vmax+1
else if(flag)ans=vmax+1;//儿子中有最大权值,加一就是最大了
else{
ans=vmax;//根是最大值
break;
}
}
for(int j=head[i];j;j=e[j].nxt)
mp[a[e[j].to]]++;//再加回来
} printf("%d\n",ans);//以上都没有更新,就是vmax+2的情况
return 0;
}

【模拟】CF 796C Bank Hacking的更多相关文章

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

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

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

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

  3. CodeForces - 796C Bank Hacking

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

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

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

  5. Bank Hacking CodeForces - 796C

    题目 题意: 一条笨狗要去黑银行,银行有n个,它们之间用n-1条边连接.可以选择任意一个银行开始黑,但是后面每一次黑的银行都要求与已经黑过的银行直接相连.每个银行初始有一个防御值,每一个银行被黑后,与 ...

  6. 【codeforces 796C】Bank Hacking(用一些技巧来代替multiset)

    [题目链接]:http://codeforces.com/contest/796/problem/C [题意] 给你n个节点,你一开始选择一个节点,然后打掉它,然后与被打掉过的节点相连的节点才能被 打 ...

  7. 【codeforces 796C】Bank Hacking

    [题目链接]:http://codeforces.com/contest/796/problem/C [题意] 给你n个节点,你一开始选择一个节点,然后打掉它,然后与被打掉过的节点相连的节点才能被 打 ...

  8. CF796C Bank Hacking 思维

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

  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. React和Vue的异同

    Vue和React是时下比较受欢迎的三巨头之二,对Angular不慎了解,就不在赘述. React是由Facebook开发的一个js ui框架,其最大的变化就是VirtualDOM和新语法JSX vu ...

  2. Java简介以及入门

    JAVA基础知识 Java简介 作者:詹姆斯·高斯林(James Gosling) Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此J ...

  3. [LeetCode] 337. 打家劫舍 III (树形dp)

    题目 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个&q ...

  4. 一次MySQL索引失效引发的思考

    最近公司做了一个千万数量级的项目,由于要求性能比较高,每一个相对慢的查询都需要优化,项目经理是一个比较有经验的开发人员,基本上遇到问题都会先自行处理:或自己分析原因或网络寻求帮助. 但是项目平稳运行一 ...

  5. SSM框架中,事务无法回滚的原因和解决

    原因: 由ServletContextListener加载spring配置文件产生的是父容器,springMVC产生的是子容器,子容器对Controller进行扫描装配时装配了@Service注解的实 ...

  6. Shell编程(5)

    文本处理三剑客 在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具:                 命令                描述 grep 默认不支持扩展表达式,加-E ...

  7. JVM学习(六)JVM常见知识问答

    文章更新时间:2020/04/21 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程. Java源文 ...

  8. 新版 C# 高效率编程指南

    前言 C# 从 7 版本开始一直到如今的 9 版本,加入了非常多的特性,其中不乏改善性能.增加程序健壮性和代码简洁性.可读性的改进,这里我整理一些使用新版 C# 的时候个人推荐的写法,可能不适用于所有 ...

  9. Salesforce LWC学习(二十六) 简单知识总结篇三

    首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...

  10. Pycharm默认输入状态是insert状态,选中文字无法直接输入替换或删除

    最近在学习Python,使用pycharm的时候,我的光标处于加粗状态,也就是编程软件经常出现的insert插入编辑模式,我就点击了一下insert按键,退出了这个模式,但是我每次打开都是会处于这种模 ...