Advertisement
Guest User

Untitled

a guest
Jan 24th, 2018
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define SQ(a) (a)*(a)
  4.  
  5. #define F0R(i, a) for(int i = 0; i < (a); i++)
  6. #define FOR(i, a, b) for(int i = (a); i < (b); i++)
  7. #define R0F(i, a) for(int i = (a) - 1; i >= 0; i--)
  8. #define ROF(i, a, b) for(int i = (b) - 1; i >= (a); i--)
  9.  
  10. #define ran() (rand() & 0x7FFF)
  11. #define rand31() ((ran() << 16) | (ran() << 1) | (ran() & 1))
  12. #define rand32() ((ran() << 17) | (ran() << 2) | (ran() & 3))
  13. #define rand63() (((ll)ran() << 48) | ((ll)ran() << 33) | ((ll)ran() << 18) | ((ll)ran() << 3) | ((ll)ran() & 7))
  14. #define rand64() (((ll)ran() << 49) | ((ll)ran() << 34) | ((ll)ran() << 19) | ((ll)ran() << 4) | ((ll)ran() & 15))
  15.  
  16. #define F first
  17. #define S second
  18. #define PB push_back
  19. #define MP make_pair
  20. #define MT make_tuple
  21. #define UB upper_bound
  22. #define LB lower_bound
  23. #define X real()
  24. #define Y imag()
  25. #define R real()
  26. #define I image()
  27. #define PI acos(-1)
  28. #define MAXK 100
  29. #define MAXN 100000
  30.  
  31. using namespace std;
  32.  
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. typedef long double ld;
  36. typedef pair<int, int> pii;
  37. typedef vector<int> vi;
  38. typedef complex<ld> point;
  39. typedef complex<ld> cld;
  40.  
  41. struct Case {
  42.  
  43. ll best;
  44. ll stop;
  45.  
  46. Case(ll bb = 0, ll ss = 0) {
  47. best = bb, stop = ss;
  48. }
  49.  
  50. ll getAt(ll curr) {
  51. if(curr >= stop) return best;
  52. return best + curr - stop;
  53. }
  54.  
  55. };
  56.  
  57. int n, k;
  58. vector<pair<ll, ll>> shifts, sa;
  59. int pileLoc[MAXK + 1], pileLo[MAXK + 1], pileHi[MAXK + 1];
  60. Case pile[MAXK + 1][MAXN];
  61.  
  62. void insertToPile(int pileID, Case c) {
  63. int p = pileLoc[pileID];
  64. while(pileHi[p] - pileLo[p]) {
  65. if(c.getAt(pile[p][pileHi[p] - 1].stop) >= pile[p][pileHi[p] - 1].best) pileHi[p]--;
  66. else break;
  67. }
  68. if(pileHi[p] - pileLo[p] == 0 || c.best > pile[p][pileHi[p] - 1].best) pile[p][pileHi[p]++] = c;
  69. }
  70.  
  71. Case bestCase(int pileID, ll curr) {
  72. int p = pileLoc[pileID];
  73. while(pileHi[p] - pileLo[p] > 1) {
  74. if(pile[p][pileLo[p]].getAt(curr) <= pile[p][pileLo[p] + 1].getAt(curr)) pileLo[p]++;
  75. else break;
  76. }
  77. return pile[p][pileLo[p]];
  78. }
  79.  
  80. void moveOn() {
  81. F0R(i, k + 1) pileLoc[i] = (pileLoc[i] + k) % (k + 1);
  82. pileLo[pileLoc[0]] = 0;
  83. pileHi[pileLoc[0]] = 0;
  84. }
  85.  
  86. void printPiles() {
  87. F0R(i, k + 1) {
  88. cout << i << ": ";
  89. int p = pileLoc[i];
  90. FOR(j, pileLo[p], pileHi[p]) cout << "(" << pile[p][j].best << " " << pile[p][j].stop << ") ";
  91. cout << endl;
  92. }
  93. }
  94.  
  95. void solve() {
  96. F0R(i, k + 1) pileLoc[i] = i;
  97. pileHi[0]++;
  98. F0R(i, n) {
  99. Case best0 = bestCase(0, sa[i].F);
  100. Case toAddTo0(best0.getAt(sa[i].F) + sa[i].S - sa[i].F, sa[i].S);
  101. FOR(j, 1, k + 1) {
  102. if(pileHi[pileLoc[j]] - pileLo[pileLoc[j]] == 0) continue;
  103. Case best = bestCase(j, sa[i].F);
  104. insertToPile(j - 1, Case(best.getAt(sa[i].F) + sa[i].S - sa[i].F, sa[i].S));
  105. }
  106. moveOn();
  107. insertToPile(0, toAddTo0);
  108. }
  109. }
  110.  
  111. int main() {
  112. ifstream fin("lifeguards.in");
  113. ofstream fout("lifeguards.out");
  114. fin >> n >> k;
  115. F0R(i, n) {
  116. pair<ll, ll> shift;
  117. fin >> shift.F >> shift.S;
  118. shifts.PB(shift);
  119. }
  120. sort(shifts.begin(), shifts.end());
  121. int hiEnd = -1;
  122. int realK = k;
  123. F0R(i, n) {
  124. if(shifts[i].S > hiEnd) sa.PB(shifts[i]), hiEnd = shifts[i].S;
  125. else realK--;
  126. }
  127. n += realK - k;
  128. k = max(0, realK);
  129. solve();
  130. fout << bestCase(k, 1000000002LL).getAt(1000000002LL) << endl;
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement