题目大意

洛谷链接

给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加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. jsop之---实现过程

    JSONP(JSONP - JSON with Padding是JSON的一种“使用模式”),利用script标签的src属性(浏览器允许script标签跨域) 跨域访问,非同源访问 <!DOC ...

  2. DoS拒绝服务-工具使用hping3、nping等(四)

    Hping3几乎可以定制发送任何tcp/ip数据包,用于测试fw,端口扫描,性能测试 Syn Flood – hping3 -c 1000 -d 120 -S -w 64 -p 80 --flood ...

  3. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 2 - Neural Network Basics(第二周测验 - 神经网络基础)

    Week 2 Quiz - Neural Network Basics(第二周测验 - 神经网络基础) 1. What does a neuron compute?(神经元节点计算什么?) [ ] A ...

  4. 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 4 - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络)

    Week 4 Quiz - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络) \1. What is the "cache" ...

  5. RXJAVA之聚合操作

    concat 按顺序连接多个Observables.需要注意的是Observable.concat(a,b)等价于a.concatWith(b). startWith 在数据序列的开头增加一项数据.s ...

  6. vue v-for渲染数据出现DOMException: Failed to execute 'removeChild' on 'Node': The node .....

    在项目中,使用了vue的v-for渲染数组数据,在一次改变数组的时候出现异常报错,而实际的数组是已经变化过的了,页面卡死 网上找了一下原因,说是vue的DOM渲染的时候,删除之后DOM里面的还没有反应 ...

  7. 【运维】Vmware虚拟机静态IP的设置

    这几天学习大数据,搭建的集群服务器由于Vmware内部实现的虚拟网关,动态分配ip,使得每次ip更改后,均需要修改集群节点的每个hosts文件,不然集群间联系会出错,因此为了杜绝这个问题,这里修改集群 ...

  8. 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

    开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...

  9. Linux 命令: sed

    sed -- sed 命令对于Linux系统来说,在命令行修改,操作文本是非常的方便. 特别是批量的修改某些字符等,是非常省时省力的,非常适合在自动化的脚本中去应用. 如下的几个小例子: 1)如何删除 ...

  10. 小程序开发-iView app的NoticeBar 通告栏修改背景颜色

    NoticeBar 通告栏 这是个比较好用的组件,具体使用方法见 http://inmap.talkingdata.com/wx/index_prod.html#/components/notice- ...