fork download
  1. // ROOT : DRAGON3012009 : Wa In Real Life
  2. #include <bits/stdc++.h>
  3. #define ll long long
  4. #define el "\n"
  5. #define _ROOT_ int main()
  6. #define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
  7. #define FORD(i,r,l) for(int i = r ; i >= l ; i --)
  8. #define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
  9. #define fi first
  10. #define se second
  11. #define M 1000000007
  12. #define MAXN 1000001
  13. #define INF (1ll<<60)
  14. #define NAME "file"
  15. #define debug(a) cerr << #a << " = " << a << endl ;
  16. #define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
  17. using namespace std;
  18. const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
  19. const ll NMOD = 1;
  20.  
  21. ll n, q ;
  22. ll a[MAXN ] ;
  23. ll c[MAXN ] ;
  24. ll cost[MAXN][2] ;
  25. ll dp[MAXN][2] ;
  26. ll deg[MAXN ] ;
  27. bool used[MAXN ] ;
  28.  
  29. void init()
  30. {
  31. cin >> n ;
  32. FOR(i, 1, n ) cin >> a[i], deg[a[i]] ++ ;
  33. FOR(i, 1, n ) cin >> c[i] ;
  34. }
  35.  
  36. void solve()
  37. {
  38. ll ans = 0 ;
  39. FOR(i, 0, n ) FOR(j, 0, 1 ) dp[i][j] = cost[i][j] = INF ;
  40. FOR(i, 1, n ) cost[i][0] = 0, cost[i][1] = (a[i] == i ? 0 : c[i]) ;
  41. queue<ll> q ;
  42.  
  43. FOR(i, 1, n ) if(deg[i] == 0 ) q.push(i) ;
  44.  
  45. while(!q.empty() )
  46. {
  47. ll u = q.front() ; q.pop() ;
  48. used[u] = true ;
  49. ll v = a[u] ;
  50. cost[v][0] += cost[u][1] ;
  51. cost[v][1] += min(cost[u][1], cost[u][0]) ;
  52. if(-- deg[v] == 0 ) q.push(v) ;
  53. }
  54.  
  55. FOR(i, 1, n )
  56. {
  57. if(used[i] ) continue ;
  58. vector<ll> cycle ;
  59. ll u = i ;
  60. while(!used[u])
  61. {
  62. cycle.push_back(u) ;
  63. used[u] = true ;
  64. u = a[u] ;
  65. }
  66. // cout << " daw da" << el ;
  67. ll k = cycle.size() ;
  68.  
  69. if(k == 1 )
  70. {
  71. ans += cost[cycle[0]][1] ;
  72. continue ;
  73. }
  74.  
  75. dp[cycle[0]][0] = cost[cycle[0]][0] ;
  76. dp[cycle[0]][1] = INF ;
  77. FOR(i, 1, k - 1 )
  78. {
  79. dp[cycle[i]][0] = dp[cycle[i - 1 ]][1] + cost[cycle[i]][0] ;
  80. dp[cycle[i]][1] = min(dp[cycle[i- 1]][0], dp[cycle[i - 1]][1]) + cost[cycle[i]][1] ;
  81. }
  82. // ll add = min(dp[cycle[k - 1]][0], dp[cycle[k - 1]][1] ) ;
  83. ll add = dp[cycle[k-1]][1] ; // Vii bat dau = 0
  84. dp[cycle[0]][0] = INF ;
  85. dp[cycle[0]][1] = cost[cycle[0]][1] ;
  86. FOR(i, 1, k - 1 )
  87. {
  88. dp[cycle[i]][0] = dp[cycle[i - 1 ]][1] + cost[cycle[i]][0] ;
  89. dp[cycle[i]][1] = min(dp[cycle[i- 1]][0], dp[cycle[i - 1]][1]) + cost[cycle[i]][1] ;
  90. }
  91. add = min(add, min(dp[cycle[k - 1]][0], dp[cycle[k - 1]][1] )) ;
  92. ans += add ;
  93. }
  94. cout << ans << el ;
  95. }
  96.  
  97. _ROOT_
  98. {
  99. // freopen(NAME".inp" , "r" , stdin);
  100. // freopen(NAME".out" , "w", stdout) ;
  101. ios_base::sync_with_stdio(0);
  102. cin.tie(0);
  103. cout.tie(0);
  104. int t = 1; // cin >> t ;
  105. while(t--)
  106. {
  107. init();
  108. solve();
  109. }
  110. return (0&0);
  111. }
  112.  
Success #stdin #stdout 0.01s 7728KB
stdin
Standard input is empty
stdout
0