【题目链接】:http://codeforces.com/contest/796/problem/C

【题意】



给你n个节点,你一开始选择一个节点,然后打掉它,然后与被打掉过的节点相连的节点才能被

打掉,但打掉一个点之后,与它距离小于等于2的节点的权值会增加1(如果中间节点有被打掉的,则不增加,即被切断了);

重复上述步骤,直至所有节点被打掉,能打掉某个节点,你需要满足:你的权值大于等于这个节点的权值.求一开始你的

权值的最小值;

【题解】



思路在这里http://blog.csdn.net/harlow_cheng/article/details/70050833

这篇题解的程序;

使用的是一些技巧;

以期替代缓慢的multiset

具体的实现的时候;

需要维护最大值,和最大值的数目

以及次小值以及次小值的数目;

以及某个点和最大值的点连接了几个;

某个点和次大值的点连接了几个;

除了和当前枚举的起点距离为1的点增加1之外,其他点(除了自身)都增加2;

根据这个以及上面得到的值不难做出讨论;

主要的思路↓↓↓

/*
if (a[i]==max1)//如果是最大值
{
if (cnt1[i]==tot1-1)//如果剩余的最大值都围着这个最大值
{
if (tot1==1)//如果只有这一个最大值
{
if (cnt2[i]==tot2)//如果第二小的值全都围着它
//那么第二小的值只会+1,不可能大过最大值
ans = min(ans,max1);
else//在外圈还有max2则看看max1和max2+2哪一个大
ans = min(ans,max(max1,max2+2));
}
else
ans = min(ans,max1+1);//这个时候max1+1肯定>=max2+2所以
//不用考虑max2了
}
else//如果有剩余的最大值在外圈,则用max1+2更新答案
ans = min(ans,max1+2);
}
else
{
//不是最大值
if (cnt1[i]==tot1)//如果最大值都围着它 那么最大值+1更新
ans = min(ans,max1+1);
else
ans = min(ans,max1+2);//有一个在外圈,那么肯定那个外圈会加2
}
*/

【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 3e5+100;
const int INF = -1e9-100; int a[N],n,max1=INF,max2=INF,tot1,tot2,ans=1e9+100;
int cnt1[N],cnt2[N]; void gx(int x)
{
if (x==max1)
tot1++;
else
if (x==max2)
tot2++;
else
{
if (x>max1)
{
swap(max1,max2);swap(tot1,tot2);
max1 = x,tot1 = 1;
}
else
if (x>max2)
tot2=1,max2 = x;
}
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false),cin.tie(0);
cin >> n;
rep1(i,1,n)
cin >> a[i],gx(a[i]);
rep1(i,1,n-1)
{
int x,y;
cin >> x >> y;
if (a[x]==max1) cnt1[y]++;
if (a[y]==max1) cnt1[x]++;
if (a[x]==max2) cnt2[y]++;
if (a[y]==max2) cnt2[x]++;
}
rep1(i,1,n)
if (a[i]==max1)
{
if (cnt1[i]==tot1-1)
{
if (tot1==1)
{
if (cnt2[i]==tot2)
ans = min(ans,max1);
else
ans = min(ans,max(max1,max2+2));
}
else
ans = min(ans,max1+1);
}
else
ans = min(ans,max1+2);
}
else
{
if (cnt1[i]==tot1)
ans = min(ans,max1+1);
else
ans = min(ans,max1+2);
}
cout << ans << endl;
return 0;
}

【codeforces 796C】Bank Hacking(用一些技巧来代替multiset)的更多相关文章

  1. CodeForces - 796C Bank Hacking

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

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

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

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

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

  4. 【模拟】CF 796C Bank Hacking

    题目大意 洛谷链接 给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权. 其他见链接(懒). PS:原题面很不好总 ...

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

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

  6. 【codeforces 796C】Bank Hacking

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

  7. Bank Hacking CodeForces - 796C

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

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

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

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

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

随机推荐

  1. YTU 2715: 函数---判断某年某月某日是这一年中的第几天

    2715: 函数---判断某年某月某日是这一年中的第几天 时间限制: 1 Sec  内存限制: 128 MB 提交: 380  解决: 155 题目描述 在主程序(main)中输入某年某月某日,例如2 ...

  2. YTU 2705:用重载求距离

    2705: 用重载求距离. 时间限制: 1 Sec  内存限制: 128 MB 提交: 208  解决: 114 题目描述 使用函数重载的方法定义两个重名函数,分别求出整型数的两点间距离和浮点型数的两 ...

  3. allonsy

    时间限制 1s 空间限制 512MB 2.1 题目描述 "Allons-y!" 时间还算足够,好好看看题吧. 有一种说法,时间线是扭曲的,会相互交织.(一般在科幻片里比较流行?) ...

  4. ubuntu下设置共享目录

    在使用VirtualBox和相关的客户机系统比如XPMac等需要用到一些相关功能共享剪贴板等等这时候需要安装VirtualBox中的一个工具叫做Guest Additions中文叫法不一增强工具包功能 ...

  5. Secure CRT中解决vim高亮设置的方法

    此文主要是解决vim编程中高亮显示的.原因是: 1.默认情况下,SecureCRT是有自己的终端显示颜色.这样在我们编程中不利于阅读内容. 2.我们必须到Linux系统中进行改进才能真正解决这样的问题 ...

  6. E20171005-ts

    collapse  n. 垮台; (身体的) 衰弱;              vt. 使倒塌; 使坍塌; 使瓦解;               vi. 崩溃; 倒塌; 折叠; (尤指工作劳累后) 坐 ...

  7. css样式之vertical-align垂直居中的应用

    css样式之vertical-align垂直居中的应用:将图片垂直左右居中 元素垂直居中 1:必须给容器父元素加上text-align:center 2:必须给当前元素转换成行内块元素,display ...

  8. Linux命令(005) -- kill、pkill和killall的比较

    kill命令用来“杀掉”指定进程PID的进程.终止一个前台进程可以使用Ctrl+C,终止一个后台进程就须用kill命令.kill命令是通过向进程发送指定的信号来结束相应进程的.在默认情况下,kill命 ...

  9. 涨知识-VI 基于TCP/UDP的应用层协议

    基于TCP/UDP的应用层协议: 基于TCP: Telnet(Teletype over the Network, 网络电传),通过一个终端(terminal)登陆到网络 FTP(File Trans ...

  10. (转)50道JavaScript基础面试题(附答案)

    https://segmentfault.com/a/1190000015288700 1 介绍JavaScript的基本数据类型 Number.String .Boolean .Null.Undef ...