【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家银行,第一次可以攻击任意一家银行(能量低于自身),跟被攻击银行相邻或者间接相邻( ...
随机推荐
- [luogu4735]最大异或和
https://zybuluo.com/ysner/note/1238161 题面 给定一个初始长度为\(N\)的非负整数序列\(\{a\}\). 有\(m\)个操作,操作分为两种: 在序列末尾加一个 ...
- openstack service glance-api/registry mysql of max_connection
- 用回调函数创建一个XMLHttpRequest,并从一个TXT文件中检索数据。
<script> var xmlhttp; function loadXMLDoc(url,soyo) { if (window.XMLHttpRequest) {// IE7+, Fir ...
- App上架流程 & 上架被拒10大原因
上架前预热 先登陆自己的开发者账号(自己提前注册好 iOS 开发者账号,这里假设你已经拥有了一个 iOS 开发者账号),进入这个页面:https://developer.apple.com/accou ...
- Atlantis(坐标离散化)
http://poj.org/problem?id=1151 题意:给出矩形的左上角坐标和右下角坐标(坐标的y轴是向下的),求出矩形面积的并.. 今天好困啊..迷迷糊糊的听会神给讲了讲,敲完之后调试了 ...
- P3128 [USACO15DEC]最大流Max Flow(LCA+树上差分)
P3128 [USACO15DEC]最大流Max Flow 题目描述 Farmer John has installed a new system of pipes to transport mil ...
- git配置用户信息
git配置用户信息 一.在本地配置用户信息 配置内容:user.name 和 user.email 配置目的:Git用来记录谁做了什么事 配置方法:windows下打开Git Bash进行操作 gi ...
- php微信开放平台--第三方网页微信扫码登录(OAuth2.0)
第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...
- display:none 和 hidden 区别
- 如何获取select控件的option值和Value?
案例: <select id="paId" class="text3"> <option value=& ...