【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家银行,第一次可以攻击任意一家银行(能量低于自身),跟被攻击银行相邻或者间接相邻( ...
随机推荐
- FormatString格式大众人全
FormatString格式大众人全 Posted on 2010-08-12 16:14 moss_tan_jun 阅读(457) 评论(0) 编辑 收藏 格式化日期和数字的字符串经常要用到这个, ...
- 【POJ 3263】 Tallest Cow
[题目链接] http://poj.org/problem?id=3263 [算法] 若A和B两头牛可以互相看见,那么说明中间的牛的高度都至少比它们少1,因此,我们可以引入一个差分数组c 对于每组关系 ...
- bzoj3112
http://www.lydsy.com/JudgeOnline/problem.php?id=3112 模板题...模板又打错了... #include<bits/stdc++.h> u ...
- Ruby 离奇方法
send https://ref.xaio.jp/ruby/classes/object/send find https://ref.xaio.jp/ruby/classes/enumerable/f ...
- SpringMVC+Jquery实现Ajax
一.什么是Ajax? Ajax:异步的JavaScript和Json(这里XML改为了Json): 作用:用于完成网页局部刷新功能(修改少量数据只用局部刷新,不用再整个网页重新加载): 二.Sprin ...
- Django day26 HyperlinkedIdentityField,序列化组件的数据校验以及功能的(全局,局部)钩子函数,序列化组件的反序列化和保存
一:HyperlinkedIdentityField(用的很少):传三个参数:第一个路由名字,用来反向解析,第二个参数是要反向解析的参数值,第三个参数:有名分组的名字 -1 publish = ser ...
- Vue 页面回退参数被当作字符串处理
当时情景是这样的,我从A页面跳到B页面时会传一个Boolean类型的参数,当B跳到C,再从C返回B的时候,控制台打印发现参数还在,可是判断怎么都不起作用,后来发现,当页面返回的时候,默认将参数变成了字 ...
- Elasticsearch索引的操作,利用kibana(如何创建/删除一个es的索引?)
我们已经通过索引一篇文档创建了一个新的索引 .这个索引采用的是默认的配置,新的字段通过动态映射的方式被添加到类型映射.现在我们需要对这个建立索引的过程做更多的控制:我们想要确保这个索引有数量适中的主分 ...
- Kafka详解与总结(二)
Kafka Stream Kafka Streams是一个客户端库,用于构建任务关键型实时应用程序和微服务,其中输入和输出数据存储在Kafka集群中.Kafka Streams结合了在客户端编写和部署 ...
- BZOJ 3456 NTT图的计数 容斥
思路: RT 懒得写了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm&g ...