【codeforces 796C】Bank Hacking(用一些技巧来代替multiset)
【题目链接】: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)的更多相关文章
- CodeForces - 796C Bank Hacking
思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...
- Code Forces 796C Bank Hacking(贪心)
Code Forces 796C Bank Hacking 题目大意 给一棵树,有\(n\)个点,\(n-1\)条边,现在让你决策出一个点作为起点,去掉这个点,然后这个点连接的所有点权值+=1,然后再 ...
- codeforce 796C - Bank Hacking(无根树+思维)
题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To searc ...
- 【模拟】CF 796C Bank Hacking
题目大意 洛谷链接 给定一棵带点权树,选出一个最佳的根节点,使得根节点的点权不变,它的儿子点权加1,其余点点权加2,并使最大点权最小,输出这个最小的最大点权. 其他见链接(懒). PS:原题面很不好总 ...
- C. Bank Hacking 解析(思維)
Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...
- 【codeforces 796C】Bank Hacking
[题目链接]:http://codeforces.com/contest/796/problem/C [题意] 给你n个节点,你一开始选择一个节点,然后打掉它,然后与被打掉过的节点相连的节点才能被 打 ...
- Bank Hacking CodeForces - 796C
题目 题意: 一条笨狗要去黑银行,银行有n个,它们之间用n-1条边连接.可以选择任意一个银行开始黑,但是后面每一次黑的银行都要求与已经黑过的银行直接相连.每个银行初始有一个防御值,每一个银行被黑后,与 ...
- Codeforces Round #408 (Div. 2) C. Bank Hacking
http://codeforces.com/contest/796/problem/C Although Inzane successfully found his beloved bone, Zan ...
- Codeforces Round #408 (Div. 2)C. Bank Hacking(STL)
题目链接:http://codeforces.com/problemset/problem/796/C 题目大意:有n家银行,第一次可以攻击任意一家银行(能量低于自身),跟被攻击银行相邻或者间接相邻( ...
随机推荐
- 【SCOI 2011】 糖果
[题目链接] 点击打开链接 [算法] 当x = 1时,连边(a,b,0)和(b,a,0) 当x = 2时,连边(a,b,1) 当x = 3时,连边(b,a,0) 当x = 4时,连边(b,a,1) 当 ...
- linux下的so、o、lo、a、la文件的区别
o: 编译的目标文件a: 静态库,其实就是把若干o文件打了个包so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息la: 使用libtool编译出 ...
- activiti安装-------安装插件
对上面的放大
- Euclid(几何)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2831 题意:已知A,B,C,D,E,F的坐标, ...
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- JS属性defer
其实就是简单的利用defer属性,让浏览器读JS脚本的时候完全不等脚本开始读就开始读下面的图片啊,html代码了.然后让js脚本自己在那里慢慢读取完以后再执行. 给外链的js脚本添加defer=& ...
- mina2 笔记
http://www.iteye.com/topic/1112123 http://dongxuan.iteye.com/blog/901689 http://scholers.iteye.com/b ...
- jQuery文档就绪
很多jQuery代码都有如下片段: $(document).ready(function(){ //代码 }) 作用就是等文档结构加载完成后再去执行function中的代码,功能类似于window.o ...
- html5——私有前缀
CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分,像border-radius等属性需要加私有前缀才奏效 1.-webkit-:谷歌 ...
- JS——AJAX
向服务器发送请求如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:Open方法了有两种请求方式——get和post 与 POST 相比,GE ...