【题目链接】: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. 当Table中td内容为空时,让它显示边框的办法

    1 在 table的css里面加 border-collapse:collapse; 在 td 的css里面加      empty-cells:show; border-collapse设置或检索表 ...

  2. Java开源JSP标签库

    01displytag 与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮.完善. 02cewolf tag 用来在web上显示复杂图形报表的一个jsp tag. 03Loading T ...

  3. Paratroopers(最小割模型)

    http://poj.org/problem?id=3308 题意:一个m*n的网格,有L位火星空降兵降落在网格中,地球卫士为了能同时消灭他们,在网格的行或列安装了一个枪支,每行或每列的枪支都能消灭这 ...

  4. Codeforces 455D 分块+链表

    题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...

  5. mongoDB的基本用法

    一.MongoDB初识 什么是MongoDB MongoDB是一个基于分布式文件存储的数据库.由c++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库 ...

  6. ACM_迟到的祝福(四)

    迟到的祝福(四) Time Limit: 2000/1000ms (Java/Others) Problem Description: 据说前几天是雁来师姐的生日,作为一个15级的小鲜肉A,没及时给师 ...

  7. CSS------选择器-----------选择器的分组、属性选择器

    /*!--选择器的分组--*/ .groupDiv h1,h2,h3,h4{ color: #000000; } /*------------------------属性选择器--*/ [title] ...

  8. iOS动画——DynamicAnimate

    力学动画 以dynamicAnimate为首的力学动画是苹果在iOS7加入的API,里面包含了很多力学行为,这套API是基于Box2d实现的.其中包含了重力.碰撞.推.甩.和自定义行为. 涉及到的类如 ...

  9. wait、notify、notifyAll实现线程间通信

    在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调 ...

  10. [Android]异常2-Unexpected error while executing

    异常原因: 可能一>Android Studio的自动编译没有成功 解决方法有: 解决一>菜单栏里的“Build”,“Clean Project” 注: