despores

Untitled

Feb 26th, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <set>
  5. #include <map>
  6. #include <bitset>
  7. #include <algorithm>
  8. #include <iomanip>
  9. #include <cmath>
  10. #include <unordered_set>
  11. #include <unordered_map>
  12. #include <queue>
  13. #include <deque>
  14. #include <stack>
  15. #include <cstring>
  16. #include <numeric>
  17.  
  18. using namespace std;
  19.  
  20. typedef long long ll;
  21. typedef long double ld;
  22. typedef pair<int,int> pii;
  23. #define FOR(i, k, l) for(int i = k; i < l; i++)
  24. #define DFOR(i, k, l) for(int i = k; i > l; i--)
  25. #define FA(i, k) for(int i = 0; i < int(k.size()); i++)
  26. #define DFA(i, k) for(int i = int(k.size()) - 1; i > -1; i--)
  27. #define ASKS(i) for(cin >> (i); (i)--;)
  28.  
  29.  
  30. #define MAXINT 2147483647
  31. #define endl '\n'
  32. #define all(x) x.begin(), x.end()
  33. #define rall(x) x.rbegin(), x.rend()
  34. #define fi first
  35. #define se second
  36.  
  37. pii gr[100011];
  38. pair<bool, bool> used[100011];
  39. int prcyc[100011];
  40. ll ans;
  41. vector<int> cyc[50011];
  42. int pos, sum;
  43. void dfs(int v) {
  44. if(v == 0) {
  45. ans+=sum;
  46. return;
  47. }
  48. used[v].fi = 1;
  49. pii to = gr[v];
  50. if(to.fi == gr[to.fi].fi) {
  51. ans+= sum;
  52. ans+= max(to.se, gr[to.fi].se);
  53. } else if(used[to.fi].fi) {
  54. if(!used[to.fi].se){
  55. int s = to.fi;
  56. while(!used[s].se) {
  57. used[s].se = 1;
  58. cyc[pos].push_back(s);
  59. s = gr[s].fi;
  60. }
  61. pos++;
  62. } else {
  63. prcyc[to.fi] = max(prcyc[to.fi], to.se);
  64. ans+=sum;
  65. }
  66. } else {
  67. sum+= to.se;
  68. dfs(to.fi);
  69. }
  70. }
  71.  
  72.  
  73. int main() {
  74. ios::sync_with_stdio(0);
  75. cin.tie(0);
  76. cout.tie(0);
  77. ll n;
  78. cin >> n;
  79. pair<int, pii> sn[n];
  80. map<int, pii> snack;
  81. FOR(i, 0, n){
  82. int f,p,m,s;
  83. cin >> f >> p >> m >> s;
  84. sn[i] = {f,{p, i+1}};
  85. snack[i+1] = {m, s};
  86. }
  87. sort(sn, sn+n);
  88. FOR(i, 0, n) {
  89. int a = sn[i].fi, b= sn[i].se.fi;
  90. if(snack[a].se > 0) {
  91. int dif = snack[a].fi - b;
  92. if(dif > 0) {
  93. ans += dif*(snack[a].se-1);
  94. snack[a].se = -1;
  95. gr[sn[i].se.se] = {snack[a].fi, dif};
  96. }
  97. }
  98. }
  99. FOR(i,1,n+1) if(gr[i].fi) cout << i << " " << gr[i].fi << " " << gr[i].se << endl;
  100. FOR(i, 1, n+1) {
  101.  
  102. if(gr[i].fi != 0 && !used[i].fi) {
  103. sum = 0;
  104. dfs(i);
  105. }
  106. }
  107. FOR(i, 0, pos) {
  108. int mx = - 1;
  109. for(int to: cyc[i]) {
  110.  
  111. }
  112. }
  113. cout << ans << endl;
  114. return 0;
  115. }
Add Comment
Please, Sign In to add comment