CF-796C
题意:
有n家银行,每个银行都有自己的权值,当我们攻击一个银行时,跟他距离为1和2的银行权值都会+1。
只有在我们本身权值大于银行权值时才可以攻击,求本身至少需要多少权值。
可以将所有的银行关系看成一棵树,则与根节点距离为一的银行最终会+1,其余的+2.
由此我们就有maxn,maxn+1,maxn+2三种可能的结果。
当最大值maxn只有一个时,若所有maxn-1距离maxn都为1,则本身需要maxn,否则需要maxn+1。
当最大值大于一个时,若存在一点,其本身和距离为1的点包含了所有maxn,则只需要maxn+1,
否则maxn+2。
附AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=300010; 5 6 vector<int> mp[N]; 7 int a[N]; 8 9 10 int main(){ 11 int n,x,y,u,ans; 12 int maxn=-1000000010; 13 cin>>n; 14 for(int i=1;i<=n;i++){ 15 mp[i].clear(); 16 cin>>a[i]; 17 maxn=max(a[i],maxn); 18 } 19 for(int i=1;i<n;i++){ 20 cin>>x>>y; 21 mp[x].push_back(y); 22 mp[y].push_back(x); 23 } 24 int ma=0,mb=0; 25 for(int i=1;i<=n;i++){ 26 if(a[i]==maxn) 27 ma++,u=i; 28 if(a[i]==maxn-1) 29 mb++; 30 } 31 if(ma==1){ 32 int cont=0; 33 for(int i=0;i<mp[u].size();i++){ 34 int v=mp[u][i]; 35 if(a[v]==maxn-1) 36 cont++; 37 } 38 if(cont==mb) 39 ans=maxn; 40 else 41 ans=maxn+1; 42 cout<<ans<<endl; 43 } 44 else{ 45 bool flag=false; 46 for(int i=1;i<=n;i++){ 47 int cont=0; 48 if(a[i]==maxn) 49 cont++; 50 for(int j=0;j<mp[i].size();j++){ 51 int v=mp[i][j]; 52 if(a[v]==maxn) 53 cont++; 54 } 55 if(cont==ma) 56 flag=true; 57 } 58 if(flag){ 59 cout<<maxn+1<<endl; 60 } 61 else{ 62 cout<<maxn+2<<endl; 63 } 64 } 65 return 0; 66 }