Advertisement
Guest User

usaco 792 lifeguards

a guest
Jan 19th, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define pii pair<int,int>
  4. #define pll pair<ll,ll>
  5. #define pli pair<ll,int>
  6. #define fi first
  7. #define se second
  8. #define inf (INT_MAX/2-1)
  9. #define infl (1LL<<60)
  10. #define vi vector<int>
  11. #define pb push_back
  12. #define sz(a) (int)(a).size()
  13. #define all(a) begin(a),end(a)
  14. #define y0 y5656
  15. #define y1 y7878
  16. #define aaa system("pause");
  17. #define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
  18. #define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
  19. #define dbgs(x) cerr<<(#x)<<"[stl]: ";for(int _:x)cerr<<_<<' ';cerr<<'\n',aaa
  20. #define dbgp(x) cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
  21. #define maxn 100000
  22. #define maxk 100
  23.  
  24. using namespace std;
  25.  
  26. vector<pii> v, u;
  27. int D[maxn+5][maxk+5];///d[i][j]=profit maxim daca incluzi primii i oameni, concediezi j
  28. ///din ei si il tii neaparat pe al i-lea
  29. int d[maxn+5][maxk+5];///d[i][j]=profit max oameni 1..i concediezi j oameni
  30. int nd[maxn+5];///=indicele ultimului interval care nu se intersecteaza cu i
  31.  
  32. void umax (int &a, int b) { a = max(a,b); }
  33.  
  34. int main () {
  35. //  ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  36.   ifstream cin ("lifeguards.in");
  37.   ofstream cout ("lifeguards.out");
  38.   int n, k; cin >> n >> k;
  39.   int i, j, z;
  40.   v.resize(n);
  41.   for (i = 0; i < n; i++) cin >> v[i].fi >> v[i].se;
  42.   sort (all(v), [](pii a, pii b) {
  43.         if (a.fi != b.fi) return a.fi < b.fi;
  44.         return a.se > b.se; });
  45.   int rm = 0, amt = 0;
  46.   for (i = 0; i < n; i++) {
  47.     umax(rm, v[i].se);
  48.     if (rm == v[i].se) u.pb(v[i]);
  49.     else amt++;
  50.   }
  51.   v.clear(); v.pb({0,0}); for (pii x: u) v.pb(x);
  52.   n -= amt; k = max(k-amt, 0);
  53.   for (i = 0, j = 1; j <= n; j++) {
  54.     while (i+1 < j && v[i+1].se <= v[j].fi) i++;
  55.     nd[j] = i;
  56.   }
  57.   for (j = 1; j <= k; j++) d[0][j] = D[0][j] = -inf;
  58.   for (i = 1; i <= n; i++) {
  59.     for (j = 0; j <= min(k, i-1); j++) {
  60.       umax(D[i][j], d[nd[i]][max(0,j-(i-nd[i]-1))] + v[i].se-v[i].fi);
  61.       ///^incluzi max pt tot ce e in fata ai sa poti adauga v[i].se-v[i].fi
  62.       z = nd[i]+1;
  63.       if (z < i) umax(D[i][j], D[z][max(0,j-(i-z-1))] + v[i].se-v[z].se);
  64.       ///^incluzi primul segment care se its cu al i-lea, nu mai ai nevoie de restul
  65.       ///pana la i
  66.     }
  67.     d[i][0] = D[i][0];///<--!!!
  68.     for (j = 1; j <= min(k,i); j++) d[i][j] = max(d[i-1][j-1], D[i][j]);
  69.   }
  70.   cout << d[n][k];
  71.   return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement