链接:https://www.nowcoder.com/acm/contest/86/I
来源:牛客网
题目描述
接下去,Sεlιнα(Selina) 又搞了个文艺竞演。
虽说是文艺竞演,其实只是为了满足 Sεlιнα 的内心企盼——看群男友献歌献舞。她排列好了各个参赛男友的节目顺序,然后将他们安排在两个舞台上表演,自己则在演播室里使用两台闭路电视同时观看。万万没想到的是,当一切准备就绪时,其中一台电视炸了,她不会修,也没有时间修。于是只能尴尬地使用一台闭路电视观看两个舞台上的节目。当然,这台电视不支持分屏同时观看,所以 Sεlιнα 只能不停地换台观看。现在,作为导演的 Sεlιнα 已经知道了两个舞台的节目 单以及每个节目 对于她所能产生的愉悦度 ,她想安排电视在每个时刻播放的频道(可以在某些时刻不看),使得自己能得到最大的愉悦度。现在请优秀的你告诉 Sεlιнα 最大能产生的愉悦度是多少。
要注意的是,文艺竞演没有广告插播,所以当一个节目结束时,另一个节目会立刻开始演出。 并且 Sεlιнα 看节目以分钟为单位,也就是说,她只能在每分钟结束的那一刻切换舞台。节目对 Sεlιнα 产生愉悦度是以分钟为单位的,也就是说,她看第 个节目每一分钟就会产生 的愉悦度。而 Sεlιнα 对节目的完整性丝毫不在意,没有完整地看一个节目是没有关系的。
输入描述:
第一行三个数 ,表示舞台一有 个节目,舞台二有 个节目,总时长为 分钟。
接下去 行,每行两个整数 ,表示舞台一的第 个节目在第 分钟结束后开始,每分钟能产生愉悦度 。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
接下去 行,每行两个整数 ,表示舞台二的第 个节目在第 分钟结束后开始,每分钟能产生愉悦度 。当一个节目开始时,这个舞台之前正在播放的节目直接停止,中间没有暂停。
数据保证每个舞台都有一个在 分钟时开始的节目(即最开始的节目),并且在同一个舞台中没有两个节目开始时间相同(即没有一个节目时长为 )。数据不保证输入中每个舞台的 会从小到大排序。
输出描述:
输出共一行,一个整数,表示最大的愉悦度。
示例1
备注:
思路:
1. 将题目中的两个序列按照时间升序排列,然后合并在一个时间轴,在每个时间段内寻找获得效益最大的。 所以合并操作很容易想到 归并排序的思路
2. 使用 set ,离散化时间代替手写归并过程
【注】:题目中 可以有空闲时间段,因此 权值可能为负,所以 max3(0,a,b) 最小是0
方法一 AC 码:
1 #include <algorithm> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <cmath> 6 #include <iostream> 7 #include <map> 8 #include <queue> 9 #include <set> 10 #include <vector> 11 12 using namespace std; 13 14 15 #define max3(x, y, z) max(max((x), (y)), (z)) 16 #define min3(x, y, z) min(mix((x), (y)), (z)) 17 #define pb push_back 18 #define ppb pop_back 19 #define mk make_pair 20 #define pii pair<int, int> 21 #define pll pair<long long, long long> 22 23 24 #define debug_l(a) cout << #a << " " << (a) << endl 25 #define debug_b(a) cout << #a << " " << (a) << " " 26 #define testin(filename) freopen((filename) ,"r",stdin) 27 #define testout(filename) freopen((filename) ,"w",stdout) 28 29 30 #define close_sync (ios::sync_with_stdio(false)) 31 32 33 34 typedef long long ll; 35 typedef unsigned long long ull; 36 37 38 const double PI = 3.14159265358979323846264338327; 39 const double E = exp(1); 40 const double eps = 1e-6; 41 42 const int INF = 0x3f3f3f3f; 43 const int NINF = 0xc0c0c0c0; 44 // int maxn = 3e3 + 5; 45 // int MOD = 1e9 + 7; 46 47 48 template <typename T> 49 void print_arr(T *arr, int arr_len) 50 { 51 for (int i = 0; i < arr_len; i++) 52 cout << arr[i] << " "; 53 cout << endl; 54 } 55 56 /*==================================begin=======================================*/ 57 58 const int maxn = 1e5+5; 59 struct Node {int x,v;}; 60 Node f[maxn],s[maxn]; 61 int cmp(Node n1, Node n2){ 62 return n1.x<n2.x; 63 } 64 int main() 65 { 66 // testin("data.in"); 67 close_sync; 68 int N,M,T; 69 cin>>N>>M>>T; 70 for(int i=0;i<N;i++) cin>>f[i].x>>f[i].v; 71 for(int i=0;i<M;i++) cin>>s[i].x>>s[i].v; 72 sort(f,f+N,cmp); sort(s,s+M,cmp); 73 74 f[N].x=s[M].x=T; //关键,在遍历到数组最后一个元素的时候,下一个值是结束时间。从而计算权值 75 76 int i=0,j=0,t=0,nt; 77 ll ans=0; 78 while(i<N && j<M){ 79 if(f[i].x<=t) i++; 80 if(s[j].x<=t) j++; 81 nt= min(f[i].x,s[j].x); 82 ans+=(nt-t)*max3(0,f[i-1].v,s[j-1].v); 83 t=nt; 84 } 85 while(i<N){ 86 if(f[i].x<=t) i++; 87 ans+=(f[i].x-t)*max3(0,f[i-1].v,s[j-1].v); 88 t=f[i].x; 89 } 90 while(j<M){ 91 if(s[j].x<=t) j++; 92 ans+=(s[j].x-t)*max3(0,f[i-1].v,s[j-1].v); 93 t=s[j].x; 94 } 95 cout<<ans<<endl; 96 return 0; 97 }
方法二 AC 码:
1 #include <algorithm> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <cmath> 6 #include <iostream> 7 #include <map> 8 #include <queue> 9 #include <set> 10 #include <vector> 11 12 using namespace std; 13 14 15 #define max3(x, y, z) max(max((x), (y)), (z)) 16 #define min3(x, y, z) min(mix((x), (y)), (z)) 17 #define pb push_back 18 #define ppb pop_back 19 #define mk make_pair 20 #define pii pair<int, int> 21 #define pll pair<long long, long long> 22 23 24 #define debug_l(a) cout << #a << " " << (a) << endl 25 #define debug_b(a) cout << #a << " " << (a) << " " 26 #define testin(filename) freopen((filename) ,"r",stdin) 27 #define testout(filename) freopen((filename) ,"w",stdout) 28 29 30 #define close_sync (ios::sync_with_stdio(false)) 31 32 33 34 typedef long long ll; 35 typedef unsigned long long ull; 36 37 38 const double PI = 3.14159265358979323846264338327; 39 const double E = exp(1); 40 const double eps = 1e-6; 41 42 const int INF = 0x3f3f3f3f; 43 const int NINF = 0xc0c0c0c0; 44 // int maxn = 3e3 + 5; 45 // int MOD = 1e9 + 7; 46 47 48 template <typename T> 49 void print_arr(T *arr, int arr_len) 50 { 51 for (int i = 0; i < arr_len; i++) 52 cout << arr[i] << " "; 53 cout << endl; 54 } 55 56 /*==================================begin=======================================*/ 57 const int maxn = 1e5+5; 58 struct Node 59 { 60 int x,v; 61 }; 62 63 Node f[maxn],s[maxn]; 64 65 int cmp(Node n1, Node n2){ 66 return n1.x<n2.x; 67 } 68 69 void print_arr(Node a[],int n){ 70 for(int i=0;i<n;i++) 71 cout<<"("<<a[i].x<<","<<a[i].v<<")"; 72 cout<<endl; 73 } 74 75 int main() 76 { 77 //testin("data.in"); 78 close_sync; 79 int N,M,T; 80 cin>>N>>M>>T; 81 for(int i=0;i<N;i++) cin>>f[i].x>>f[i].v; 82 for(int i=0;i<M;i++) cin>>s[i].x>>s[i].v; 83 sort(f,f+N,cmp); sort(s,s+M,cmp); 84 85 // print_arr(f,N);print_arr(s,M); 86 87 set<int> ss; 88 for(int i=0;i<N;i++) ss.insert(f[i].x); 89 for(int i=0;i<M;i++) ss.insert(s[i].x); 90 ss.insert(T); 91 92 // for(set<int>::iterator it=ss.begin();it!=ss.end();++it) 93 // cout<<*it<<" "; 94 // cout<<endl; 95 96 f[N].x=T;f[N].v=f[N-1].v; 97 s[M].x=T;s[M].v=s[M-1].v; 98 99 set<int>::iterator it=ss.begin(); 100 ll ans=0; 101 for(int i=0,j=0,t=0;t<T;){ 102 while(i+1<N+1 && f[i+1].x<=t) i++; 103 while(j+1<M+1 && s[j+1].x<=t) j++; 104 ans+=(*(++it)-t)*(max3(f[i].v,s[j].v,0)); 105 // debug_b(t),debug_b(*it),debug_b(max3(f[i].v,s[j].v,0)),debug_b(i),debug_l(j); 106 t=*it; 107 } 108 cout<<ans<<endl; 109 110 return 0; 111 }