Advertisement
willy108

#3

Feb 12th, 2022
1,368
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. //misaka will carry me to master
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <utility>
  7. #include <cassert>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <functional>
  11. #include <numeric>
  12. #include <set>
  13. #include <map>
  14.  
  15. #define ll long long
  16. #define lb long double
  17. #define sz(vec) ((int)(vec.size()))
  18. #define all(x) x.begin(), x.end()
  19. #define pb push_back
  20. #define mp make_pair
  21.  
  22. const lb eps = 1e-9;
  23. const ll mod = 1e9 + 7, ll_max = 1e18;
  24. //const ll mod = (1 << (23)) * 119 +1;
  25. const int MX = 50, int_max = 0x3f3f3f3f;
  26. const int NN = 19;
  27. using namespace std;
  28.  
  29. int dp[MX][(1 << NN) +10]; //ive reached node i with colors mask
  30. vector<int> radj[MX];
  31. int n, m;
  32. int w[MX], c[MX], ans[MX];
  33. int occ[MX];
  34. vector<int> srt;
  35.  
  36. void slow(){
  37.     int k = sz(srt);
  38.     radj[1].pb(0);
  39.     for(int u = 1; u<=n; u++){
  40.         if(occ[c[u]] > 1){
  41.             int comp = (lower_bound(all(srt), c[u]) - srt.begin());
  42.             int cu = 1 << comp;
  43.             for(int v : radj[u]){
  44.                 for(int i = 0; i<(1 << k); i++){
  45.                     if(cu&i){
  46.                         dp[u][i] = max(dp[u][i], dp[v][i]);
  47.                         ans[u] = max(ans[u], dp[u][i]);
  48.                     }else{
  49.                         dp[u][i|cu] = max(dp[u][i|cu], dp[v][i] + w[srt[comp]]);
  50.                         ans[u] = max(ans[u], dp[u][i&cu]);
  51.                     }  
  52.                 }  
  53.             }
  54.         }else{
  55.             for(int v : radj[u]){
  56.                 for(int i = 0; i<(1 << k); i++){
  57.                     dp[u][i] = max(dp[u][i], dp[v][i] + w[c[u]]);
  58.                     ans[u] = max(ans[u], dp[u][i]);
  59.                 }
  60.             }
  61.         }
  62.     }
  63. }
  64.  
  65. void solve(){
  66.     scanf("%d%d", &n, &m);
  67.     for(int i = 1; i<=n; i++) scanf("%d", c+i);
  68.  
  69.     for(int i = 1; i<=n; i++) scanf("%d", w+i);
  70.     for(int i = 0; i<m; i++){
  71.         int a, b;
  72.         scanf("%d%d", &a, &b);
  73.         radj[b].pb(a);
  74.     }
  75.     for(int i = 1; i<=n; i++){
  76.         occ[c[i]]++;
  77.     }
  78.     for(int i = 1; i<=n; i++){
  79.         if(occ[i] > 1) srt.pb(i);
  80.     }
  81.     sort(all(srt));
  82.     slow();
  83.     for(int i = 1; i<=n; i++){
  84.         printf("%d\n", ans[i]);
  85.     }
  86. }
  87.  
  88. int main(){
  89.   cin.tie(0) -> sync_with_stdio(0);
  90.  
  91.   int T = 1;
  92.   //cin >> T;
  93.   while(T--){
  94.         solve();
  95.   }
  96.   return 0;
  97. }
  98.  
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement