Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 1000007
- #define INF -1e9+7
- using namespace std;
- struct show{
- int ini, fim;
- int palco, shows;
- show(){}
- show(int _ini, int _fim, int _shows, int _palco): ini(_ini), fim(_fim), shows(_shows), palco(_palco){}
- };
- int dp[1 << 11][1007], n, palcos;
- show arr[MAX];
- int bb(int num){
- int l = 0, r = n;
- while(l < r){
- int mid = (l+r)/2;
- if(arr[mid].ini >= num) r = mid;
- else l = mid+1;
- }
- return l;
- }
- int solve(int idx, int shows, int mask){
- int prox = bb(arr[idx].fim);
- //cout << idx << " " << prox << endl;
- if(idx == n){
- if(mask == (1 << palcos)-1) return shows;
- return -1e9+7;
- }
- if(dp[mask][idx] != -1) return dp[mask][idx];
- int ans = solve(prox, shows+arr[idx].shows, mask | arr[idx].palco);
- ans = max(solve(idx+1, shows, mask), ans);
- return dp[mask][idx] = ans;
- }
- bool compare(show a, show b){
- return a.ini < b.ini;
- }
- int main(){
- scanf("%d", &palcos);
- n = 0;
- for(int i = 0; i < palcos; i++){
- int n_shows; scanf("%d", &n_shows);
- for(int j = 0; j < n_shows; j++){
- int l, r, q; scanf("%d %d %d", &l, &r, &q);
- arr[n++] = show(l, r, q, 1 << i);
- }
- }
- arr[n] = show(-INF, -INF, 0, 0);
- sort(arr, arr+n, compare);
- memset(dp, -1, sizeof dp);
- int resp = solve(0, 0 , 0);
- printf("%d\n", resp == INF ? -1: resp);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment