Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define pli pair<ll,int>
- #define fi first
- #define se second
- #define inf (INT_MAX/2-1)
- #define infl (1LL<<60)
- #define vi vector<int>
- #define pb push_back
- #define sz(a) (int)(a).size()
- #define all(a) begin(a),end(a)
- #define y0 y5656
- #define y1 y7878
- #define aaa system("pause");
- #define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
- #define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
- #define dbgs(x) cerr<<(#x)<<"[stl]: ";for(int _:x)cerr<<_<<' ';cerr<<'\n',aaa
- #define dbgp(x) cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
- #define maxn 100000
- #define maxk 100
- using namespace std;
- vector<pii> v, u;
- int D[maxn+5][maxk+5];///d[i][j]=profit maxim daca incluzi primii i oameni, concediezi j
- ///din ei si il tii neaparat pe al i-lea
- int d[maxn+5][maxk+5];///d[i][j]=profit max oameni 1..i concediezi j oameni
- int nd[maxn+5];///=indicele ultimului interval care nu se intersecteaza cu i
- void umax (int &a, int b) { a = max(a,b); }
- int main () {
- // ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
- ifstream cin ("lifeguards.in");
- ofstream cout ("lifeguards.out");
- int n, k; cin >> n >> k;
- int i, j, z;
- v.resize(n);
- for (i = 0; i < n; i++) cin >> v[i].fi >> v[i].se;
- sort (all(v), [](pii a, pii b) {
- if (a.fi != b.fi) return a.fi < b.fi;
- return a.se > b.se; });
- int rm = 0, amt = 0;
- for (i = 0; i < n; i++) {
- umax(rm, v[i].se);
- if (rm == v[i].se) u.pb(v[i]);
- else amt++;
- }
- v.clear(); v.pb({0,0}); for (pii x: u) v.pb(x);
- n -= amt; k = max(k-amt, 0);
- for (i = 0, j = 1; j <= n; j++) {
- while (i+1 < j && v[i+1].se <= v[j].fi) i++;
- nd[j] = i;
- }
- for (j = 1; j <= k; j++) d[0][j] = D[0][j] = -inf;
- for (i = 1; i <= n; i++) {
- for (j = 0; j <= min(k, i-1); j++) {
- umax(D[i][j], d[nd[i]][max(0,j-(i-nd[i]-1))] + v[i].se-v[i].fi);
- ///^incluzi max pt tot ce e in fata ai sa poti adauga v[i].se-v[i].fi
- z = nd[i]+1;
- if (z < i) umax(D[i][j], D[z][max(0,j-(i-z-1))] + v[i].se-v[z].se);
- ///^incluzi primul segment care se its cu al i-lea, nu mai ai nevoie de restul
- ///pana la i
- }
- d[i][0] = D[i][0];///<--!!!
- for (j = 1; j <= min(k,i); j++) d[i][j] = max(d[i-1][j-1], D[i][j]);
- }
- cout << d[n][k];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement