Codeforces 796C Bank Hacking 贪心+规律
来源:互联网 发布:蘑菇软件是什么 编辑:程序博客网 时间:2024/05/20 18:15
点击打开链接
题意:n个结点,n-1条边,每个点价值为a[i],两点有边直接相连,算相邻,i,j半相邻:存在没被攻击的中间点k,(i,k),(j,k)是相邻的
攻击i后,和i相邻和半相邻的点a[k]++,n<=3e5,求攻击n个点需要的最小x?
除了第一次外,每次攻击的点必须满足:1:online,2:和某个offline相邻,3:a[i]<=x
n点,n-1条边且连通,则为无根的树,任取一点为根
关键在于条件2:每次能被攻击的点都要和offline相连->任意一点u的值最多+2
通过第一次操作后.对任意点u
若当u的祖先被攻击时,u最多+2,此时它的任意子结点v,只有当u被攻击时才能被攻击,子节点对u贡献为0
若为u的某个子树被攻击,u的其余子树和u的祖先 都只有在u被攻击时才被攻击,所以任意点u的值最多+2,ans<=mx+2
综上:第一次攻击的点+0,其相邻点+1 其余点都+2,
C1为mx个数 C2为mx-1个数
ans=mx 只有当C1=1&&正好有C2个mx-1与mx相连
ans=mx+1 只有当存在一个点满足 其距离<=1内 mx的个数为C1
其余情况ans=mx+2
#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<ll,ll> ii;const ll inf=1e10;const int N=2e6+20;ll n,a[N],vis[N],can[N]; vector<int> e[N];void solve(){ll C1=0,C2=0,mx=-inf,u;for(int i=1;i<=n;i++)mx=max(a[i],mx);for(int i=1;i<=n;i++){if(a[i]==mx)C1++,u=i;else if(a[i]==mx-1)C2++; }ll ans=inf;if(C1==1)//{int cnt=0;for(int i=0;i<e[u].size();i++){int v=e[u][i];if(a[v]==mx-1)cnt++;}if(cnt==C2)ans=mx;}if(ans==inf){for(int i=1;i<=n&&ans==inf;i++)//遍历边O(n),找到相邻为1内,有C1个mx {ll res=0;if(a[i]==mx)res++;for(int j=0;j<e[i].size();j++){int v=e[i][j];if(a[v]==mx)res++;}if(res==C1)ans=mx+1;}}if(ans==inf)ans=mx+2;cout<<ans<<endl;}int main(){while(cin>>n){for(int i=1;i<=n;i++)scanf("%I64d",&a[i]),e[i].clear();int u,v;for(int i=1;i<=n-1;i++){scanf("%d%d",&u,&v);e[u].push_back(v);e[v].push_back(u);}solve();}return 0;}
0 0
- Codeforces 796C Bank Hacking 贪心+规律
- codeforces-796C-Bank Hacking(贪心)
- CodeForces 796C Bank Hacking
- 796C Bank Hacking
- Codeforces Round #408 C. Bank Hacking
- codeforces round #408 C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking 无根树、贪心、枚举
- codeforce 796C Bank Hacking 智力题orz
- C. Bank Hacking
- codeforces round#408(div.2) C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking(二分)
- Codeforces Round #408 (Div. 2) C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking(分类讨论)
- Codeforces Round #408 (Div. 2) C. Bank Hacking
- Codeforces Round #408 /Mcvi Round #8 C Bank Hacking
- C. Bank Hacking----思维题
- codeforce 796 c Bank Hacking (思维题,分类讨论)
- Codeforces Round #408 (Div. 2) C.Bank Hacking【思维+分类讨论】
- C3P0连接池配置
- MyBatis使用总结和整合Spring
- 1小时搭建个人网站:购买虚拟主机,购买域名,绑定IP和申请SSL证书实现https
- SNNU2017校赛(部分)题解
- Spring和Mybatis整合时无法读取properties的处理方案
- Codeforces 796C Bank Hacking 贪心+规律
- Channel is unrecoverably broken and will be disposed!
- 云核心网解决方案及其演进方向
- 忏悔
- 数字电路1 -三极管开关
- log4j+commons-logging结合使用
- 17. Letter Combinations of a Phone Number
- dedecms上传图片附件文件夹按年月保存
- mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType