Advertisement
boook

Untitled

Jan 6th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. /*input
  2. 3
  3. 1 1
  4. 1 2
  5. 2 1
  6. */
  7. #include <bits/stdc++.h>
  8. #include <ext/pb_ds/assoc_container.hpp>
  9. using namespace std;
  10. using namespace __gnu_pbds;
  11. #define REP(i,j,k) for(int i = j ; i < k ; ++i)
  12. #define RREP(i,j,k) for(int i = j ; i >=k ; --i)
  13. #define A first
  14. #define B second
  15. #define mp make_pair
  16. #define pb emplace_back
  17. #define PII pair<int , int>
  18. #define MEM(i,j) memset(i , j , sizeof i)
  19. #define ALL(i) i.begin() , i.end()
  20. #define DBGG(i,j) cout << i << " " << j << endl
  21. #define DB4(i,j,k,l) cout << i << " " << j << " " << k << " " << l << endl
  22. #define IOS cin.tie() , cout.sync_with_stdio(0)
  23. #define endl "\n"
  24. ///------------------------------------------------------------
  25. #define MAX 220
  26. #define INF 0x3f3f3f3f
  27.  
  28. int lx[MAX] , ly[MAX] , good[MAX] , w[MAX][MAX] , slk[MAX];
  29. int n , s[MAX] , t[MAX];
  30. PII x[MAX];
  31. int match(int now){
  32. s[now] = 1;
  33. REP(to , 0 , n){
  34. if(t[to]) continue;
  35. if(lx[now] + ly[to] == w[now][to]){
  36. t[to] = 1;
  37. if(good[to] == -1 || match(good[to]))
  38. return good[to] = now , 1;
  39. }
  40. else slk[to] = min(slk[to] , lx[now] + ly[to] - w[now][to]);
  41. }
  42. return 0;
  43. }
  44. void update(){
  45. int val = INF;
  46. REP(i , 0 , n) if(t[i] == 0) val = min(val , slk[i]);
  47. REP(i , 0 , n){
  48. if(s[i]) lx[i] -= val;
  49. if(t[i]) ly[i] += val;
  50. }
  51. }
  52. void solve(){
  53. REP(i , 0 , n){
  54. REP(j , 0 , n){
  55. good[i] = -1;
  56. lx[i] = max(lx[i] , w[i][j]);
  57. }
  58. }
  59. REP(i , 0 , n){
  60. MEM(slk , INF);
  61. while(1){
  62. MEM(s , 0) , MEM(t , 0);
  63. if(match(i)) break;
  64. else update();
  65. }
  66. }
  67. }
  68. int32_t main(){
  69. cin >> n;
  70. REP(i , 0 , n) cin >> x[i].A >> x[i].B;
  71. REP(i , 0 , n){
  72. REP(j , 0 , n){
  73. if(x[i] == x[j] && i > j) w[i][j] = x[j].A * x[j].B;
  74. if(x[i] != x[j] && x[i].A >= x[j].A && x[i].B >= x[j].B)
  75. w[i][j] = x[j].A * x[j].B;
  76. }
  77. }
  78. solve();
  79. int ans = 0;
  80. REP(i , 0 , n) ans += x[i].A * x[i].B - w[good[i]][i];
  81. cout << ans << endl;
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement