codeforces round #408 C. Bank Hacking

xiaoxiao2021-02-27  612

题意:太复杂··· 思路:每个银行最多只能加两次,起点一次都不加,起点相邻的点只加一次,剩下的加两次,所以只需要二分法最小化最大值。。。坑点有点多,代码自行体会··· #include <iostream> #include <cstdio> #include <vector> using namespace std; const int maxn = 300000+10; const long long INF = 1e10+1; int n; long long arr[maxn]; vector<int>vis[maxn]; bool check(long long x) {     int tmp = 0;     for(int i=1;i<=n;i++)     {         if(arr[i]>x)             return false;         if(arr[i]+2>x)             tmp++;     }     for(int i = 1;i<=n;i++)     {         int ans = tmp;         if(arr[i]+2>x)             ans--;         for(int j = 0;j<vis[i].size();j++)         {             int b = vis[i][j];             if(arr[b]+1==x)                 ans--;         }         if(ans==0)             return true;     }     return false; } int main() {     scanf("%d",&n);     long long maxx = -INF;     long long minn = INF;     for(int i = 1;i<=n;i++)     {         scanf("%lld",&arr[i]);         maxx = max(arr[i],maxx);         minn = min(arr[i],minn);     }     for(int i = 1;i<=n-1;i++)     {         int a,b;         scanf("%d%d",&a,&b);         vis[a].push_back(b);         vis[b].push_back(a);     }     long long l = minn,r = maxx+2;     long long gg = l;     while(l<=r)     {         long long mid = (l+r)/2;         if(check(mid))         {             gg = mid;             r = mid-1;         }         else             l = mid+1;     }     printf("%lld",gg);     return 0; }
转载请注明原文地址: https://www.6miu.com/read-59.html

最新回复(0)