leoanjos

Peddler

Apr 29th, 2021
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define long long long int
  6.  
  7. #define pii pair<int, int>
  8. #define pll pair<long, long>
  9. #define fst first
  10. #define snd second
  11.  
  12. #define all(ds) (ds).begin(), (ds).end()
  13. #define size(ds) (int) (ds).size()
  14.  
  15. #define pq priority_queue
  16. #define vi vector<int>
  17. #define pb push_back
  18. #define lb lower_bound
  19. #define ub upper_bound
  20.  
  21. const int MAX = 2e5 + 5;
  22.  
  23. int A[MAX];
  24. vector<vi> g;
  25.  
  26. int memo[MAX][2];
  27.  
  28. int profit(int v, int bought = 0) {
  29.     if (!size(g[v])) return bought ? A[v] : INT_MIN;
  30.  
  31.     int &ans = memo[v][bought];
  32.     if (~ans) return ans;
  33.  
  34.     ans = INT_MIN;
  35.  
  36.     if (bought) ans = A[v];
  37.     for (auto u: g[v]) {    
  38.         ans = max(ans, profit(u, bought));
  39.         if (!bought) ans = max(ans, profit(u, 1) - A[v]);
  40.     }
  41.  
  42.     return ans;
  43. }
  44.  
  45. int main() {
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(NULL);
  48.  
  49.     int N, M;
  50.     cin >> N >> M;
  51.  
  52.     for (int i = 0; i < N; i++)
  53.         cin >> A[i];
  54.  
  55.     g.assign(N, vi());
  56.     while (M--) {
  57.         int X, Y;
  58.         cin >> X >> Y;
  59.         g[--X].pb(--Y);
  60.     }
  61.  
  62.     memset(memo, -1, sizeof memo);
  63.  
  64.     int ans = INT_MIN;
  65.     for (int i = 0; i < N; i++)
  66.         ans = max(ans, profit(i));
  67.  
  68.     cout << ans << "\n";
  69. }
Advertisement
Add Comment
Please, Sign In to add comment