Advertisement
Josif_tepe

Untitled

Nov 22nd, 2023
793
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long long maxn = 1e3+10;
  6. const long long mod = 1e9+7;
  7.  
  8. int main()
  9. {
  10.     ios::sync_with_stdio(false);
  11.     long long n,k;
  12.     cin>>n>>k;
  13.     long long a[n];
  14.     for(long long i=0;i<n;i++)
  15.     {
  16.         cin>>a[i];
  17.     }
  18.     vector<int>g[maxn];
  19.     for(long long i=0;i<n-1;i++)
  20.     {
  21.         long long x,y;
  22.         cin>>x>>y;
  23.         x--;y--;
  24.         g[x].push_back(y);
  25.         g[y].push_back(x);
  26.     }
  27.     long long mindis[maxn];
  28.     for(long long i=0;i<n;i++)
  29.     {
  30.         bool vis[n];
  31.         memset(vis,0,sizeof vis);
  32.         queue<int>Q;
  33.         Q.push(i);
  34.         Q.push(0);
  35.         long long mx=0;
  36.         long long idx=2e9;
  37.         vis[i]=true;
  38.         while(!Q.empty())
  39.         {
  40.             long long teme=Q.front();Q.pop();
  41.             long long kol=Q.front();Q.pop();
  42.             for(long long ax:g[teme])
  43.             {
  44.                 if(vis[ax])continue;
  45.                 if(mx<a[ax]-kol)
  46.                 {
  47.                     mx=a[ax]-kol;
  48.                     idx=ax;
  49.                 }
  50.                 else if(mx==a[ax]-kol)
  51.                 {
  52.                     idx=min(idx, ax);
  53.                 }
  54.                 Q.push(ax);
  55.                 Q.push(kol+1);
  56.                 vis[ax]=true;
  57.             }
  58.         }
  59.         mindis[i]=idx;
  60.     }
  61.     if(n<=2000 && k<=2000)
  62.     {
  63.         queue<int>ans;
  64.         ans.push(0);
  65.         while(k--)
  66.         {
  67.             long long node=ans.front();ans.pop();
  68.             long long minsosed=mindis[node];
  69.             ans.push(minsosed);
  70.         }
  71.         cout<<ans.front()+1<<endl;
  72.         return 0;
  73.     }
  74.     bool vis[maxn];
  75.     memset(vis,0,sizeof vis);
  76.     vis[0]=true;
  77.     queue<int>q;
  78.     q.push(0);
  79.     long long pat=0;
  80.     long long dis[maxn];
  81.     memset(dis,0,sizeof dis);
  82.     while(k--)
  83.     {
  84.         long long node=q.front();q.pop();
  85.         pat++;
  86.         long long minsosed=mindis[node];
  87.         q.push(minsosed);
  88.         if(!vis[minsosed])
  89.         {
  90.             dis[minsosed]=pat;
  91.             vis[minsosed] = true;
  92.         }
  93.         else
  94.         {
  95.             long long D=pat-dis[minsosed];///kolku e dolg ciklusot
  96.             long long kolku=k/D;
  97.             k-=kolku*D;
  98.         }
  99.     }
  100.     cout<<q.front() + 1<<endl;
  101.     return 0;
  102. }
  103.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement