Ankit_132

E

Aug 30th, 2023
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll     long long
  6. #define _test   int _TEST; cin>>_TEST; while(_TEST--)
  7. #define pb     push_back
  8.  
  9. int main()
  10. {
  11.     _test
  12.     {
  13.         ll int n, m, k;
  14.         cin>>n>>m>>k;
  15.  
  16.         vector<ll int> h(n);
  17.         for(auto &e: h)
  18.             cin>>e;
  19.  
  20.         vector<vector<ll int>> graph(n);
  21.         vector<int> in(n);
  22.  
  23.         for(int i=0; i<m; i++)
  24.         {
  25.             int u, v;
  26.             cin>>u>>v;
  27.  
  28.             u--, v--;
  29.  
  30.             graph[u].pb(v);
  31.             in[v]++;
  32.         }
  33.  
  34.         vector<ll int> days(n, 1);
  35.         vector<ll int> earliest(n, 1e18);
  36.  
  37.         vector<pair<ll int, ll int>> vp;
  38.  
  39.         for(int u=0; u<n; u++)
  40.         {
  41.             if(earliest[u] == 1e18)
  42.             {
  43.                 earliest[u] = h[u];
  44.                 assert(in[u] == 0);
  45.             }
  46.  
  47.             vp.pb({earliest[u], (days[u]-1)*1ll*k+h[u]});
  48.  
  49.             for(auto v: graph[u])
  50.             {
  51.                 if(h[v] < h[u])
  52.                 {
  53.                     if(days[v] < 1+days[u])
  54.                         earliest[v] = earliest[u];
  55.                     else if(days[v] == 1+days[u])
  56.                         earliest[v] = min(earliest[v], earliest[u]);
  57.  
  58.                     days[v] = max(days[v], 1+days[u]);
  59.                 }
  60.                 else
  61.                 {
  62.                     if(days[v] < days[u])
  63.                         earliest[v] = earliest[u];
  64.                     else if(days[v] == days[u])
  65.                         earliest[v] = min(earliest[v], earliest[u]);
  66.  
  67.                     days[v] = max(days[v], days[u]);
  68.                 }
  69.             }
  70.         }
  71.  
  72.         sort(vp.begin(), vp.end());
  73.  
  74.         ll int ans = 1e18, mx;
  75.         multiset<ll int> m1, m2;
  76.         for(auto [_, e]: vp)        m1.insert(e);
  77.  
  78.         for(auto [st, en]: vp)
  79.         {
  80.             mx = *m1.rbegin();
  81.             if(m2.size())       mx = max(mx, *m2.rbegin());
  82.             ans = min(ans, mx - st);
  83.  
  84.             m2.insert(en+k);
  85.         }
  86.  
  87.         cout<<ans<<"\n";
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment